Lexa000 Опубликовано 15 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 апреля, 2021 1 минуту назад, Rigal сказал: Тогда в чем смысл этого объединения? Ну пусть и работают каждый на своем графике Не то. Именно в одном. Если не хотите помочь, то зачем пишете 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 15 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 апреля, 2021 1 минуту назад, Lexa000 сказал: Ещё можете мне дать код ступидо, ту часть для множителя которая мне нужно, буду признателен Пожалуйста там могут быть зависимости на другие библиотеки, но в качестве примера реализации - берите, переиспользуйте LotManagerFull.mqh LotManagerFullDefine.mqh 3 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 15 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 апреля, 2021 4 минуты назад, Lexa000 сказал: Не то. Именно в одном. Если не хотите помочь, то зачем пишете Я пишу, чтобы понять, что вы хотите. Потому, что вы пока не определили вашу идею. Я уже упомянул две основных категории принципиально покрывающие понятие "объединить два советника" А внутри этих двух может быть пятьсот вариантов того, что вы под этим понимаете. например: Открывает ли один советник ордера с учетом лота последнего ордера второго советника? А позицию последнего ордера другого советника учитывает? А ордера его закрывает? А тейки у них общие по сетке, или раздельные? Потому, что пока у меня складывается впечатление, что вам хочется что-то с чем-то слепить, но никаких мыслей о стратегии этого слепления вас пока не посещали. Что, в свою очередь, наталкивает на вопрос, а в чем смысл этого всего И ответ, который у меня напрашивается, вовсе не торопит меня вам помогать Так что вы расскажите, что там у вас на уме - глядишь, все и прояснится, и помогут вам толковым советом 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 15 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 апреля, 2021 2 минуты назад, Rigal сказал: Так что вы расскажите, что там у вас на уме - глядишь, все и прояснится, и помогут вам толковым советом впору заводить ветку по алгоритмам... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 15 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 апреля, 2021 11 минут назад, Rigal сказал: Я пишу, чтобы понять, что вы хотите. Потому, что вы пока не определили вашу идею. Я уже упомянул две основных категории принципиально покрывающие понятие "объединить два советника" А внутри этих двух может быть пятьсот вариантов того, что вы под этим понимаете. например: Открывает ли один советник ордера с учетом лота последнего ордера второго советника? А позицию последнего ордера другого советника учитывает? А ордера его закрывает? А тейки у них общие по сетке, или раздельные? Потому, что пока у меня складывается впечатление, что вам хочется что-то с чем-то слепить, но никаких мыслей о стратегии этого слепления вас пока не посещали. Что, в свою очередь, наталкивает на вопрос, а в чем смысл этого всего И ответ, который у меня напрашивается, вовсе не торопит меня вам помогать Так что вы расскажите, что там у вас на уме - глядишь, все и прояснится, и помогут вам толковым советом Я не умею правильно формулировать ответы. Могу честно сказать, я даже не знаю как вам отвечать Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vovan777 Опубликовано 15 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 апреля, 2021 Добрый день. Урок № 3. Торговля по индикатору TMA_Fair_. Советник должен на верхней границе индикатора продавать, а закрывать ордер на нижней границе. И наоборот, на нижней границе индикатора покупать, а на верхней закрывать ордер. Так же советник ставит стоп и профит. Проблема в том, что когда цена доходит до верхней, либо нижней границ - советник должен не дожидаясь тейк-профита, закрывать ордер, а он этого не делает. Не могу понять, почему он не хочет закрывать ордер дойдя до одной из г раниц. Помогите пожалуйста. Test3.ex4 Test3.mq4 TMA_Fair_.ex4 TMA_Fair_.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rever27 Опубликовано 15 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 апреля, 2021 55 минут назад, Vovan777 сказал: Не могу понять, почему он не хочет закрывать ордер дойдя до одной из г раниц. Помогите пожалуйста. Потому что скобки не там закрываются. В текущей реализации код просто не причесан, поэтому и непонятно на глаз, в чем проблема. Вот рабочая версия. Вообще это все можно проверить через обычный Print, расставив его по всему коду вдоль и поперек, и потом уже проверять, почему он не выдается в журнал. Test3-1.mq4 4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 20 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 апреля, 2021 Хотел спросить, есть ещё Книги по mql4, кроме той что в начале? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 24 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 апреля, 2021 Вот что у меня вышло Locomotive v1.01 (71).mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Владимир Стариков Опубликовано 27 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 апреля, 2021 Members 0 29 сообщений Опубликовано только что Есть советник - сеточник. к сожалению только закомпилированный. Особый интерес вызывает функция набора объема. Т.е. во входных данных вбивается вручную ряд объемов (Volumes), которые и набираются. причем первый ордер в сетке - в переменной входных параметров Lots. Еще интересно, то что есть переменная Orders - количество ордеров. Если в переменной volumes например ряд объемов состоит из 3 элементов (допустим 0.01, 0.02, 0.03), а в Orders стоит 10, то будет выставлена сетка со следующими объемами: 0,01 (lots), 0.01, 0.02, 0.03, 0.01, 0.02, 0.03, 0.01, 0.02, 0.03, 0,01. Так вот, прошу если кто может написать функцию расчетов объемов, или изложить идею как советник видит объемы? как из строки во входных данных получается размер ордера? Спасибо! KSCH_21r.ex4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 28 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 апреля, 2021 19 часов назад, Владимир Стариков сказал: Так вот, прошу если кто может написать функцию расчетов объемов, или изложить идею как советник видит объемы? как из строки во входных данных получается размер ордера? Функцию писать лень, но реализация может быть примерно такая: в OnInit с помощью функции int StringSplit парсится входная строка с последовательностью лотов. Результат помещается в массив. Функция вернет количество элементов в массиве, тем самым узнаем- сколько шагов у сетки (в Вашем примере 3). В дальнейшем размер лота можно будет получать из массива. При строительстве сетки как правило на каждом тике происходит подсчет ордеров в рынке. Зная это количество мы можем рассчитать следующий ордер. Ссылка на сообщение Поделиться на другие сайты More sharing options...
mishastar Опубликовано 29 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 апреля, 2021 Доброго времени суток! Пытливый ум желает познать как можно запрограммировать советник или индикатор так, что бы установив их всего лишь на один график в терминале они искали заданные им условия для входа или для подачи любого уведомления: 1) по всем валютным парам. 2) только по заданным валютным парам 3) только по открытым в текущий момент в терминале парам. Например мне нужно выявлять свечи заданного размера на таймфрейме Н1. Планирую добавить в индикатор функцию, что бы не устанавливать его в 33 окна , а установив на один график он автоматом будет скринить - мониторить все пары. А если советник установить, то он будет торговать по заданным парам с одного окна. Перелапатил уже достаточно материала на эту тему, но ничего не нашел. Может у кого есть индикатор который мониторит насколько валютных пар с одного окна, дайте посмотреть код. Буду рад любой информации на эту тему. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 30 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 апреля, 2021 10 часов назад, mishastar сказал: Буду рад любой информации на эту тему. Например https://tlap.com/forum/torgovye-sistemy/2/d1h4-two-fingers/16296/ А вообще, в разделе Торговые системы есть насколько тем, где писались мультивалютные индикаторы/советники вот ещеhttps://tlap.com/forum/torgovye-sistemy/2/h1d1-torgovaya-sistema-quotva-bankquot/8306/?do=findComment&comment=194281 Изменено 30 апреля, 2021 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Геннадий_Николаев Опубликовано 30 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 апреля, 2021 Добрый день друзья! Мой уровень знаний языка программирования MQL4 не высокий, так что хочу спросить совета знающий. Пишу простенький сеточник в первые, в общий чертах идея советника такая что после открытия позиции и прохождения цены в нужную сторону, на определенное количество пунктов, надо открыть еще одну позицию, а если цена движется в том же направлении, то и еще...... и еще... . Все позиции с одним ТР и SL. Возможно надо будет трал, но это позже. Сейчас проблема (я думаю не большая) при возникновении ситуации для открытия второго ордера советник открывает очень много (сколько может) ордеров. Как этого избежать? Думаю что по магику отследить уже открытый второй ордер и больше не открывать позицию с этим магиком, а вот как это сделать? Подскажите пожалуйста. Уверен это решение есть. Заранее спасибо. Вот код для открытия второго ордера: if ((Torguem==false)==false) { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol()) {if((OrderType()==OP_BUY)&&(OrderMagicNumber()==Magic1)) // if((OrderType()!=OP_SELL) && ((OrderMagicNumber()!=Magic2))) // Если цена прошла требуемые 300 (по 5-ти значным котировкам) пунктов, то открываем еще один ордер { if (Bid>OrderOpenPrice()+(300*Point)) { bool op = OrderSend(Symbol(),OP_SELL,Lot,Bid,20, Ask+(SL*Point),Ask-(SL*TP*Point),"Сделка на продажу!",(int)Magic2, 0, Red); } }}}} Изменено 30 апреля, 2021 пользователем Геннадий_Николаев Хочу дополнить кодом. Ссылка на сообщение Поделиться на другие сайты More sharing options...
mishastar Опубликовано 30 апреля, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 апреля, 2021 1 час назад, Геннадий_Николаев сказал: Добрый день друзья! Мой уровень знаний языка программирования MQL4 Я лично скопировал код из уроков по программированию сеточного советника на ютубе и пользуюсь ей не первый год. Все отлично работает. https://youtu.be/qTgBGfPuokg Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 2 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 мая, 2021 Здраствуйте! Я вот еще собрал из нескольких сов вот такой, можете подсказать код встречного открытия в процентах: от единицы до максимально возможного. Что-то на подобие хеджа или лока Locomotive v1.01 (71).mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
diodio Опубликовано 3 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 мая, 2021 В 30.04.2021 в 19:55, Геннадий_Николаев сказал: Сейчас проблема (я думаю не большая) при возникновении ситуации для открытия второго ордера советник открывает очень много (сколько может) ордеров. Как этого избежать? Попробуй это, работает безотказно. Спойлер //+---------------------Функция которая не позволяет открывать ордера на каждом тике--------------------+ bool CheckExists(int Type) { bool Result=True; for(int n=0; n<OrdersTotal(); n++) { if(OrderSelect(n,SELECT_BY_POS)) if(OrderType()==Type && OrderMagicNumber()==Magic && OrderSymbol()==Symbol()) if(OrderOpenTime()>=Time[0]) Result=False; } for(int b=0; b<OrdersHistoryTotal(); b++) { if(OrderSelect(b,SELECT_BY_POS,MODE_HISTORY)) if(OrderType()==Type && OrderOpenTime()>=Time[0] && OrderMagicNumber()==Magic && OrderSymbol()==Symbol()) Result=False; } return(Result); } там пишешь функцию и в скобках указываешь тип ордера, например CheckExists(OP_BUY) Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 3 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 мая, 2021 1 час назад, diodio сказал: Попробуй это, работает безотказно. Показать контент //+---------------------Функция которая не позволяет открывать ордера на каждом тике--------------------+ bool CheckExists(int Type) { bool Result=True; for(int n=0; n<OrdersTotal(); n++) { if(OrderSelect(n,SELECT_BY_POS)) if(OrderType()==Type && OrderMagicNumber()==Magic && OrderSymbol()==Symbol()) if(OrderOpenTime()>=Time[0]) Result=False; } for(int b=0; b<OrdersHistoryTotal(); b++) { if(OrderSelect(b,SELECT_BY_POS,MODE_HISTORY)) if(OrderType()==Type && OrderOpenTime()>=Time[0] && OrderMagicNumber()==Magic && OrderSymbol()==Symbol()) Result=False; } return(Result); } там пишешь функцию и в скобках указываешь тип ордера, например CheckExists(OP_BUY) iBarShift(NULL,0,t)>0) Я думал эта функция не позволяет открывать на каждом тике Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 3 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 мая, 2021 extern double Risk = 5; extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2 string lock_signalsymbol = "AllSymbol"; static double lock_eqviti,lock_last, lock_lot; static bool lock_flag,flagADX,old_uptrend; //2. Функцию start() переименовываем в start_main() и добавляем над ней: int start_main(){ double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100; if (AccountRisk >Risk) lock_flag=true; if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];} if(lock_flag) start_lock(); else start_main(); return(0); } //3. В функцию init() добавляем /*init_lock(); return(0); } */ //4. Ниже добавляем: int init_lock() { lock_eqviti=AccountBalance(); lock_lot = 0; lock_last = Close[0]; flagADX=true; old_uptrend=false; signal(); lock_flag = false; return(0); } void start_lock(){ int sig,Step; if(OrdersTotal()<1){init_lock();return;} notakeprofit(); if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock(); return; } else{ sig=signal(); Step =MathAbs(sig); if (Step<lock_min_step) return; if (Ask>lock_last+(Step*Point) && sig>0 ){ if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part); RefreshRates(); if(OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue)) lock_last = Ask; } if (Bid<lock_last-(Step*Point) && sig<0){ if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part); RefreshRates(); if(OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue)) lock_last = Bid; } } return; } int signal() { int I, j, result; double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax; SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1)); for (j = 120; j >= 0; j--) { SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j); for (I = j; I <= j + SSP - 1; I++) { price = iHigh(lock_signalsymbol, PERIOD_M5,i); if (SsMax < price)SsMax = price; price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;} smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30; if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;} if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;} result = 0; if (flagADX != old_uptrend && flagADX == true) result = +1; if (flagADX != old_uptrend && flagADX == false) result = -1; old_uptrend = flagADX; } if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result); if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result); return(0); } void CloseAllFirstProfit() { int I, k=OrdersTotal(); for (I=k-1; I>=0; I--) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect(); k=OrdersTotal(); for (I=k-1; i>=0; I--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect(); } void ClosePosBySelect() { if (OrderType()==OP_BUY) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE)) if (OrderType()==OP_SELL) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE)) return; } double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) { double l=0; int I,k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (I=0; I<k; I++) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots(); return(l); } bool notakeprofit(){ bool ok=true; for (int I=OrdersTotal(); I >=0; I--) if ( OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE)) ok=false;return(ok); } return(ok); } double NormalizeLot(double lo, bool ro=True, string sy="") { double l, k; if (sy=="" || sy=="0") sy=Symbol(); double ls=MarketInfo(sy, MODE_LOTSTEP); double ml=MarketInfo(sy, MODE_MINLOT); double mx=MarketInfo(sy, MODE_MAXLOT); if (ml==0) ml=0.1; if (mx==0) mx=100; if (ls>0) k=1/ls; else k=1/ml; if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k; if (l<ml) l=ml; if (l>mx) l=mx; return(l); } Хотел спросить мнение экспертов. Я так изменил код и скопировал в советник выше, при компиляции ошибки не выдает. На сколько я правильно всё сделал? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 3 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 мая, 2021 55 минут назад, Lexa000 сказал: extern double Risk = 5; extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2 string lock_signalsymbol = "AllSymbol"; static double lock_eqviti,lock_last, lock_lot; static bool lock_flag,flagADX,old_uptrend; //2. Функцию start() переименовываем в start_main() и добавляем над ней: int start_main(){ double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100; if (AccountRisk >Risk) lock_flag=true; if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];} if(lock_flag) start_lock(); else start_main(); return(0); } //3. В функцию init() добавляем /*init_lock(); return(0); } */ //4. Ниже добавляем: int init_lock() { lock_eqviti=AccountBalance(); lock_lot = 0; lock_last = Close[0]; flagADX=true; old_uptrend=false; signal(); lock_flag = false; return(0); } void start_lock(){ int sig,Step; if(OrdersTotal()<1){init_lock();return;} notakeprofit(); if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock(); return; } else{ sig=signal(); Step =MathAbs(sig); if (Step<lock_min_step) return; if (Ask>lock_last+(Step*Point) && sig>0 ){ if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part); RefreshRates(); if(OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue)) lock_last = Ask; } if (Bid<lock_last-(Step*Point) && sig<0){ if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part); RefreshRates(); if(OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue)) lock_last = Bid; } } return; } int signal() { int I, j, result; double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax; SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1)); for (j = 120; j >= 0; j--) { SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j); for (I = j; I <= j + SSP - 1; I++) { price = iHigh(lock_signalsymbol, PERIOD_M5,i); if (SsMax < price)SsMax = price; price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;} smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30; if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;} if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;} result = 0; if (flagADX != old_uptrend && flagADX == true) result = +1; if (flagADX != old_uptrend && flagADX == false) result = -1; old_uptrend = flagADX; } if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result); if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result); return(0); } void CloseAllFirstProfit() { int I, k=OrdersTotal(); for (I=k-1; I>=0; I--) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect(); k=OrdersTotal(); for (I=k-1; i>=0; I--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect(); } void ClosePosBySelect() { if (OrderType()==OP_BUY) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE)) if (OrderType()==OP_SELL) if(OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE)) return; } double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) { double l=0; int I,k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (I=0; I<k; I++) if (OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots(); return(l); } bool notakeprofit(){ bool ok=true; for (int I=OrdersTotal(); I >=0; I--) if ( OrderSelect(I, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE)) ok=false;return(ok); } return(ok); } double NormalizeLot(double lo, bool ro=True, string sy="") { double l, k; if (sy=="" || sy=="0") sy=Symbol(); double ls=MarketInfo(sy, MODE_LOTSTEP); double ml=MarketInfo(sy, MODE_MINLOT); double mx=MarketInfo(sy, MODE_MAXLOT); if (ml==0) ml=0.1; if (mx==0) mx=100; if (ls>0) k=1/ls; else k=1/ml; if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k; if (l<ml) l=ml; if (l>mx) l=mx; return(l); } Хотел спросить мнение экспертов. Я так изменил код и скопировал в советник выше, при компиляции ошибки не выдает. На сколько я правильно всё сделал? Locomotive v1.01 (72).mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
diodio Опубликовано 5 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 мая, 2021 Всем доброго времени. Назрел маленький вопросик, хочу вывести на экран профит текущего ордера, делаю это сначала методом перебора в цикле, нахожу ордер в рынке, записываю его профит в переменную и вуаля( Код: Спойлер double runningprofit; //-------------------------------------------------------- Comment( "runningprofit = " + DoubleToString(runningprofit) ); //-------------------------------------------------------- runningprofit = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { runningprofit=OrderProfit()+OrderCommission()+OrderSwap(); } else if(OrderType()==OP_SELL) { runningprofit=OrderProfit()+OrderCommission()+OrderSwap(); } } } } В итоге он показывает постоянно ноль (0,000000) В чем может быть проблемка? Казалось бы простой перебор и цифра на экран, но увы. Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 5 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 мая, 2021 @diodio Приветствую. Вы объявляете переменную с нулем. Потом этот ноль выводите на экран. Последним действием ноль заменяете профитом. С нового цикла все повторяется. Коммент перенеси за цикл. В программировании есть разница в очередности. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 6 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 мая, 2021 10 часов назад, diodio сказал: В чем может быть проблемка? Comment( "runningprofit = " + DoubleToString(runningprofit) Помести после цикла. В твоем случае ты объявляешь переменную и сразу выводишь ее значение в Comment/ п.с. зачем в цикле раздельно считаешь профит для БАЙ и СЕЛЛ? п.п.с. runningprofit = 0; 0 можно присваивать при объявлении переменной. Минус 1 строчка Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 6 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 мая, 2021 1 час назад, Геннадий_Николаев сказал: Добрый день, я все попробую обязательно. Вам в цикле нужно выбирать не просто ордер, а Последний ордер в сетке, т.е. для Бай ордеров ордер с самой низкой ценой, а для Селл с самой высокой. Возможно нужно выбирать последний ордер не по цене, а по времени открытия. 2-3 страницы назад такой вопрос обсуждался. В Вашем же коде выбирается рандомно, скорее всего первый ордер. Соответственно, условие на открытие второго ордера всегда выполняется Ссылка на сообщение Поделиться на другие сайты More sharing options...
Just Trader Опубликовано 7 мая, 2021 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 мая, 2021 не подскажите как написать код для того чтобы все ордера какие есть закрывались в определенное время, несмотря в минусе торговле или нет? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти