Выбрать последний ордер из истории со стоп лос

 

Всем ассам привет.

В‌озникла дикая необходимасть открывать позицию в обратную сторону если ордер последний закрылся в убыток.

П‌о сути понимаю что нужно отработка по ордер селект но столкнулсп с тем что не вижу полностью логику для реализации. 

ППодсказите с решением....

 
Yevheniy Kopanitskyy:

В‌озникла дикая необходимасть открывать позицию в обратную сторону если ордер последний закрылся в убыток.
П‌о сути понимаю что нужно отработка по ордер селект но столкнулсп с тем что не вижу полностью логику для реализации. 


В коде есть правильный расчет профита последних закрытых ордеров: https://www.mql5.com/ru/code/17389

П‌ример для вас: 

if (LastProfitCL(1)<0) OrderSend(OP_BUY,-,-,-,-,-,-) //если селл ордер закрылся в убыток, то открываем ордер бай

if (LastProfitCL(0)<0) OrderSend(OP_SELL,-,-,-,-,-,-) //если бай ордер закрылся в убыток, то открываем ордер селл

if (LastProfitCL(-1)<0) //профит любого ордера


 
Natalya Dzerzhinskaya:


В коде есть правильный расчет профита последних закрытых ордеров: https://www.mql5.com/ru/code/17389

П‌ример для вас: 

if (LastProfitCL(1)<0) OrderSend(OP_BUY,-,-,-,-,-,-) //если селл ордер закрылся в убыток, то открываем ордер бай

if (LastProfitCL(0)<0) OrderSend(OP_SELL,-,-,-,-,-,-) //если бай ордер закрылся в убыток, то открываем ордер селл


А можно весь синтаксис выбора? 
 
Yevheniy Kopanitskyy:
А можно весь синтаксис выбора? 

В смысле сделать за вас??  В коде же есть нужная функция. Копировать - вставить не можете??
 
Natalya Dzerzhinskaya:

В смысле сделать за вас??  В коде же есть нужная функция. Копировать - вставить не можете??
Нет нет просто пример выбора хотел, нашол у себя в записях. Огромное спасибо за помощь.
 
Вот в продолжении.
Написал в принципе всю логику по своему усмотрению. Проблематично то что не могу понять как обратится именно к Последнему ордер в истории и получить с него значения. 


//--------Открытие противоположного ордера при стоплосс------------//

         for(int i=1;i<=OrdersTotal();i++) //нахождение ордера в исторических данных
           {
           //int i;
            if(OrderSelect(i=-1,SELECT_BY_POS,MODE_HISTORY)) //Проверить
              {
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderProfit()<0 && (OrderType()==OP_BUY || OrderType()==OP_SELL)) //условия ордера покупки

                  //--- расчёт пунктов для входа в  позицию---//
                  cenaotkrit_pozicii=OrderOpenPrice();  //цена открытия ордера
               cenastoplos=OrderStopLoss();            //цена stoplos
               calc1=10000;
               calc2=10000;


               if(cenaotkrit_pozicii>cenastoplos) //если  цена открытия больше стоп лос БАЙ
                 {
                  calc1=cenaotkrit_pozicii-cenastoplos;

                 }

               if(cenaotkrit_pozicii<cenastoplos) //если  цена открытия меньшэ стоп лос  СЕЛЛ
                 {

                  calc2=cenastoplos-cenaotkrit_pozicii;
                 }

               //-----вход в позицию-----//


               if(calc1!=10000)
                  //--Модуль по проверке открытого ордера--//
                  if(SellCount1()<1)
                    {
                       {
                        //----расчет вход в позицию СЕЛЛ----//
                        takeprofit1=NormalizeDouble(Close1-calc1*Point,5);
                        stoploss1=NormalizeDouble(Close1+calc1*Point,5);
                        ticketSell3=OrderSend(Symbol(),OP_SELL,BuyVolume,Bid,Slippage,stoploss1,takeprofit1,"",Magic,0,clrBeige);

                       }
                    }
               //--------------End---------------------------
               if(calc2!=10000)
                  //--Модуль по проверке открытого ордера БАЙ--// Добавить магик на реверс int magikrevers=1234546
                 
                if(BuyCount1()<1)
                {
                 {
                  //----расчет вход в позицию БАЙ----//
                  takeprofit2=NormalizeDouble(Close1+calc2*Point,5);
                  stoploss2=NormalizeDouble(Close1-calc2*Point,5);
                  ticketBuy3=OrderSend(Symbol(),OP_BUY,BuyVolume,Ask,Slippage,stoploss2,takeprofit2,"",Magic,0,clrAzure);
                 }
               }
              }
           }


         //---------------------End-------------------------------------------//
 
Yevheniy Kopanitskyy:
Вот в продолжении.
Написал в принципе всю логику по своему усмотрению. Проблематично то что не могу понять как обратится именно к Последнему ордер в истории и получить с него значения. 


Ох, ну и ужас в коде!!))

extern int StopLoss = 100;
extern int TakeProfit = 100;
extern int LastPriceClosePp = 1000;
//--------------------------------+
int i,send;
double SL,TP;

void start() {

  double buy_orders=0, sell_orders=0;
  for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
    if(OrderType()==0) {buy_orders++;}
    if(OrderType()==1) {sell_orders++;}
    }
  if(buy_orders==0){
  SL = NormalizeDouble(Bid - StopLoss * Point,Digits);
  TP = NormalizeDouble(Ask + TakeProfit * Point,Digits);
  if(LastProfitCL(1)<0 && MathAbs(Ask-LastCLpriceALL())>=LastPriceClosePp*Point)
    send = OrderSend(Symbol(),OP_BUY,BuyVolume,Ask,Slippage,SL,TP,"",Magic,0,clrAzure);
    }//Если профит последнего закрытого sell order <0 и рыночная цена >= цены последнего закрытия, то открываем ордер buy

  if(sell_orders==0){
  SL = NormalizeDouble(Ask + StopLoss * Point,Digits);
  TP = NormalizeDouble(Bid - TakeProfit * Point,Digits);
  if(LastProfitCL(0)<0 && MathAbs(Bid-LastCLpriceALL())>=LastPriceClosePp*Point)
    send = OrderSend(Symbol(),OP_SELL,SellVolume,Bid,Slippage,SL,TP,"",Magic,0,clrAzure);
    }//Если профит последнего закрытого buy order <0 и рыночная цена >= цены последнего закрытия, то открываем ордер sell

}//=== StartEND ===//
//--------------------------------------------------------------------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция, 0 buy, 1 sell)
  int cnt=0,cntb=0,cnts=0;
  datetime t=0,tb=0,ts=0;
  double lastprof=0.0,pr=0.0,prb=0.0,prs=0.0;

   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
       if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
       if(cnt==0 && OrderCloseTime()!=0) t=OrderCloseTime();
       if(OrderCloseTime()+PeriodSeconds()<t) break;
       if (op<0) pr=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=pr;cnt++;
       }
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
       if (OrderType()!=0||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
       if(cntb==0 && OrderCloseTime()!=0) tb=OrderCloseTime();
       if(OrderCloseTime()+PeriodSeconds()<tb) break;
       if (OrderType()==op) prb=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prb;cntb++;
       }
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
       if (OrderType()!=1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
       if(cnts==0 && OrderCloseTime()!=0) ts=OrderCloseTime();
       if(OrderCloseTime()+PeriodSeconds()<ts) break;
       if (OrderType()==op) prs=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prs;cnts++;
       }
  return(lastprof);
   }
//+---------------------------------------------------------------+
//|          Возвращает цену последнего закрытого ордера          |
//+---------------------------------------------------------------+
   double LastCLpriceALL() {
   datetime TimeCL=0;
   double CLprice=0;

   for(i=OrdersHistoryTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
      if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
      if(TimeCL<OrderCloseTime()) {TimeCL=OrderCloseTime();CLprice=OrderClosePrice();}
      }
   return (CLprice);
   }

 
Natalya Dzerzhinskaya:


Ох, ну и ужас в коде!!))

extern int StopLoss = 100;
extern int TakeProfit = 100;
extern int Magic = 777;
//-----------------------+
int i,send;
double SL,TP;

void start() {

   double  buy_orders=0, sell_orders=0;
   for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
      if(OrderType()==0) {buy_orders++;}
      if(OrderType()==1) {sell_orders++;}
   }
   if(buy_orders==0) {
   SL = NormalizeDouble(Bid - StopLoss * Point,Digits);
   TP = NormalizeDouble(Ask + TakeProfit * Point,Digits);
   if(LastProfitCL(1)<0) send=OrderSend(Symbol(),OP_BUY,BuyVolume,Ask,Slippage,SL,TP,"",Magic,0,clrAzure);
   }
   if(sell_orders==0) {
   SL = NormalizeDouble(Ask + StopLoss * Point,Digits);
   TP = NormalizeDouble(Bid - TakeProfit * Point,Digits);
   if(LastProfitCL(0)<0) send=OrderSend(Symbol(),OP_SELL,SellVolume,Bid,Slippage,SL,TP,"",Magic,0,clrAzure);
   }
}//=== StartEND ===//
//--------------------------------------------------------------------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция, 0 buy, 1 sell)
  int cnt=0,cntb=0,cnts=0;
  datetime t=0,tb=0,ts=0;
  double lastprof=0.0,pr=0.0,prb=0.0,prs=0.0;

   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
       if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
       if(cnt==0 && OrderCloseTime()!=0) t=OrderCloseTime();
       if(OrderCloseTime()+PeriodSeconds()<t) break;
       if (op<0) pr=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=pr;cnt++;
       }
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
       if (OrderType()!=0||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
       if(cntb==0 && OrderCloseTime()!=0) tb=OrderCloseTime();
       if(OrderCloseTime()+PeriodSeconds()<tb) break;
       if (OrderType()==op) prb=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prb;cntb++;
       }
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
       if (OrderType()!=1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
       if(cnts==0 && OrderCloseTime()!=0) ts=OrderCloseTime();
       if(OrderCloseTime()+PeriodSeconds()<ts) break;
       if (OrderType()==op) prs=OrderProfit()+OrderCommission()+OrderSwap(); lastprof+=prs;cnts++;
       }
  return(lastprof);
   }

//+---------------------------------------------------------------+

//|          Возвращает цену последнего закрытого ордера          |
//+---------------------------------------------------------------+
   double LastCLpriceALL() {
   datetime TimeCL=0;
   double CLprice=0;

   for(i=OrdersHistoryTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
      if (OrderType()>1||OrderSymbol()!=Symbol()||OrderMagicNumber()!=Magic) continue;
      if(TimeCL<OrderCloseTime()) {TimeCL=OrderCloseTime();CLprice=OrderClosePrice();}
      }
   return (CLprice);
   }


Наталья, к чему столько циклов в коде

м‌ожно одним обойтись

 
Alekseu Fedotov:


Наталья, к чему столько циклов в коде

м‌ожно одним обойтись


Если вы про функцию профита закрытых ордеров, то нельзя одним обойтись, т.к. подсчет становится бредовым, уже проверено 

P‌.S. у меня код исправлен поправьте и у себя в предыдущем ответе

 
Natalya Dzerzhinskaya:


Если вы про функцию профита закрытых ордеров, то нельзя одним обойтись, т.к. подсчет становится бредовым, уже проверено 

P‌.S. у меня код исправлен поправьте и у себя в предыдущем ответе


Пример, класика

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
MessageBox("\n" +
          "Профит по всем позициям = " + DoubleToString(GetProfitCurrency(),2)+" USD"+"\n" +
          "Профит по текущему символу = " + DoubleToString(GetProfitCurrency(Symbol()),2)+" USD"+"\n" +
          "Профит по текущему символу, покупки = " + DoubleToString(GetProfitCurrency(Symbol(),OP_BUY),2)+" USD"+"\n" +
          "Профит по текущему символу, продажи = " + DoubleToString(GetProfitCurrency(Symbol(),OP_SELL),2)+" USD"+"\n" +
          "Профит по текущему символу, с магиком = " + DoubleToString(GetProfitCurrency(Symbol(),-1,100),2)+" USD"
          ,"ИСТОРИЯ",MB_OKCANCEL);        
                        
  
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|                      
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//+----------------------------------------------------------------------------+
double GetProfitCurrency(string sy="", int op=-1, int mn=-1)
{
  double p=0;
  int    i, 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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {          
              p+=OrderProfit()+OrderCommission()+OrderSwap();          
          }
        }
      }
    }
  }
  return(p);
}


 

‌...  если ордер последний закрылся в убыток.

Хватит дурачить человека. Он же спросил про последний ордер

Причина обращения: