Если последняя сделка убыточная - умножаем лот последней сделки на 2, если нет - ставим первоначальный.
закрылась ли последняя сделка по стопу:
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) { datetime t; double ocp, osl; int dg, i, j=-1, k=OrdersHistoryTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) { t=OrderCloseTime(); j=i; } } } } } } } if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { dg=MarketInfo(OrderSymbol(), MODE_DIGITS); if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2; ocp=NormalizeDouble(OrderClosePrice(), dg); osl=NormalizeDouble(OrderStopLoss(), dg); if (ocp==osl || OrderProfit()<0) return(True); } return(False); }
далее в проверке лотов ставим:
if (isCloseLastPosByStop(Symbol(),-1,Magic))Lot2=OrderLots()*Martin;
if (!isCloseLastPosByStop(Symbol(),-1,Magic))Lot2=Первоначальный лот ; if(Lot2 < MinLots) Lot2 = MinLots; if(Lot2 > MaxLots) Lot2 = MaxLots; return(NormalizeDouble(Lot2,2));
Поясните, пожалуйста, где в коде тот кусок, который говорит, что если на последнем баре лось, то ... последующий лот будет увеличен.
То что идёт выборка всех ордеров на истории я вижу, но где про последний закрытый ордер не вижу.
Поясните, пожалуйста, где в коде тот кусок, который говорит, что если на последнем баре лось, то ... последующий лот будет увеличен.
То что идёт выборка всех ордеров на истории я вижу, но где про последний закрытый ордер не вижу.
В функции isCloseLastPosByStop() определяется закрылся ли последний по времени ордер по стопу.
А здесь, если последний ордер был закрыт по стопу лот увеличивается в Martin раз.
if (isCloseLastPosByStop(Symbol(),-1,Magic)) Lot2=OrderLots()*Martin;
Только Vladon почему то использовал здесь OrderLots(), что некорректно. Надо использовать вместо него функцию KimIV GetLotLastClosePos()
if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) { t=OrderCloseTime(); j=i;
Я так понимаю op это и есть OrderType т.е. тип операции. Тогда возникает вопрос не по языку уже, а по логике. Зачем в коде условие:
op<0
Ведь типы операции бывают только от 0 до 5. Вот тут же написано https://docs.mql4.com/ru/constants/trading
Выходит по логике меньше нуля не может быть тип операции. p.s. Вот на данном примере хочу разобрать логику, которая уже меня измотала. Очень часто встречаю подобные моменты.
https://forum.mql4.com/ru/11287/page21
- Базин, о чем ты мечтаешь?
- Куртку теплую купить мечтаю... Серьезно, прошлую зиму в осенней пробегал - болел всю дорогу...
- На. Носи и мечтай о чем-нибудь великом...
Я там уже был... По ссылке выложены скрипты KimIV'a. Но я задавал вопрос по логике. Там не уделяется внимания этому моменту.
Дело в том, что приведенная функция - универсальная. Смотрите ее аргументы. Трейдера может не интересовать тип ордера. В этом случае он пропускает указание параметра op. В итоге параметр получает значение -1, что приводит к вечной истинности условия:
if (op<0 || OrderType()==op)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
как в советник добавить функцию мартингейла? помогите прописать....советник ставит отложенные ордера по хай и лов с тайк профитом и стопом, нужно чтобы после убыточного ордера он увеличивал объем по мартингейлу(Х2),после выигрыша начинал с минимального лота.