По другим советникам смотрю, так и есть, но почемуто не работает как в обычном советнике
//---- расчёт лота double Free =AccountFreeMargin(); // double Lots = Free*0.1/100; for(int trade = OrdersTotal()-1; trade >=0; trade--) { if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true) { if(OrderProfit()<0){Lots=OrderLots()*2; } } if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true) { if(OrderProfit()<0){Lots=OrderLots()*2; } } return(Lots); }
опционы или не опционы - разницы для кода нет.
а вот время в комментариях это не причуда языка - а свойство брокера. в комментарий вы ставите время в виде строки - сервер опционов принимает ее как время истечения сделки. Поэтому все стандартно
да и лот выставляется так же, только без знаков после запятой. сделайте нормализацию до 0 знаков и будет счастье.
for(int trade = OrdersTotal()-1; trade >=0; trade--) { if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true) { if(OrderProfit()<0){Lots=OrderLots()*2; } } if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true) { if(OrderProfit()<0){Lots=OrderLots()*2; }
Зачем здесь два раза одно и то же ?
Вы здесь узнаете не последний ордер, а просто перебираете в конца массива сделок в истории до первого элемента. Поэтому у Вас лот всегда первый. Или 0 , потому что сделки нет еще. А Lots не известно какой.
Функция определения закрылось ли с минусом последняя сделка в истории, 1 - да, 2 - закрылась в 0, 0 - не закрылось в убыток.
sy - символ op - тип сделки mn - магик сделки
int isCloseLastPosByStop(string sy="",int op=-1,int mn=-1) { datetime t; int 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)) { if(OrderProfit()<0) return(1); if(OrderProfit()==0) return(2); } return(0); }
опционы или не опционы - разницы для кода нет.
а вот время в комментариях это не причуда языка - а свойство брокера. в комментарий вы ставите время в виде строки - сервер опционов принимает ее как время истечения сделки. Поэтому все стандартно
да и лот выставляется так же, только без знаков после запятой. сделайте нормализацию до 0 знаков и будет счастье.
Зачем здесь два раза одно и то же ?
Вы здесь узнаете не последний ордер, а просто перебираете в конца массива сделок в истории до первого элемента. Поэтому у Вас лот всегда первый. Или 0 , потому что сделки нет еще. А Lots не известно какой.
Функция определения закрылось ли с минусом последняя сделка в истории, 1 - да, 2 - закрылась в 0, 0 - не закрылось в убыток.
sy - символ op - тип сделки mn - магик сделки
Почему простой цикл последний ордер не определяет???
//+--------------------------Ордера с удвоенным лотом---------------+ double profitbuy()//профит закрытой покупки { for(int trade = OrdersHistoryTotal()-1; trade >=0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY); if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType()== OP_BUY) { double profitb= OrderProfit(); } } return(profitb); } //+------------------------------------------------------------------+ double profitsell()// профит закрытой продажи { for(int trade = OrdersHistoryTotal()-1; trade >=0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY); if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType()== OP_SELL) { double profits= OrderProfit(); } } return(profits); } //+------------------------------------------------------------------+ double lots()//объём закрытого ордера { for(int trade = OrdersHistoryTotal()-1; trade >=0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY); if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { double lots= OrderLots(); } } return(lots); } //+------------------------------------------------------------------+ // Расчёт лота double Free =AccountFreeMargin(); double Lots = Free*0.1/100; // если ордер закрылся в минус, удваиваем объём if(profitbuy()<0) Lots=lots()*2;// при такой записи всегда выбирает <0(селл или бай) if(profitbuy()>0) Lots=lots()*1; if(profitsell()<0) Lots=lots()*2; if(profitsell()>0) Lots=lots()*1;
Почему простой цикл последний ордер не определяет???
Потому, что все три цикла перебирают ордера от самого свежего до самого старого и возвращают значения для самого старого.
Как в значение return() вернуть значение самого последнего закрытого ордера ?
{ if(OrderProfit()<0) return(1); if(OrderProfit()==0) return(2); } return(0);//если так, всё равно не получается.На форуме нашёл, что фильтр по времени закрытия надо обязательно ставить.
Более простым способом как записать.
//+-------------------Функция определения профита последнего закрытого ордера-----------------------+ double pr() { datetime time=0; for(int f=OrdersHistoryTotal()-1; f>=0; f--) { if(OrderSelect(f,SELECT_BY_POS,MODE_HISTORY)) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==Magic || Magic==-1) { if(OrderCloseTime()>time) // находим последний в истории ордер { time=OrderCloseTime(); // запомним время double profit=OrderProfit(); // запомним профит double lots=OrderLots(); // запомним лот } } } } } return(profit); } //-----------------------------------------------------------
if(pr()<0) //если профит меньше нуля
Lots=2; // Увеличим в два раза
if(pr()>0) //если профит больше нуля
Lots=1; //
Вродебы и по времени , и по всем параметрам сортирует, а не работает.
Думаю может OrderProfit() в опционах нет такой функции, потому что в журнале профит пишется как Balans. хоть в минус, хоть в плюс.
Два дня парился, наконец то нашёл простую запись определения ордера.Всем спасибо, за помощь.
Два дня парился, наконец то нашёл простую запись определения ордера.Всем спасибо, за помощь.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
В советнике для опционов некоторые функции в ордерсенд поменялись местами, на месте комментария ставится время ( в видеоролике узнал).В справке mql4 этого описания нет.
Терерь не могу узнать объём предыдущей сделки.