Как узнать время последнего закрытого ордера из истории (в эксперте для META TRADER 4) ?

 
Подскажите please, как узнать время (в секундах) последнего закрытого ордера (в эксперте [Для META TRADER 4]]). Т.е. нужно узнать его тикет (или позицию) в истории и наверно через SELECT выяснить время закрытия. Но как ? + как узнать прибыль/убыток от этого ордера.

К примеру такая задача: Для работы может быть открыто максимум 2 ордера (по условию). Я хочу, чтобы следующий ордер (одно из условий) открывался не раньше, чем через 10 минут (600 сек) после того, как закрылся предыдущий ордер.
Или: Если убыток от последнего закрытого ордера составил к примеру > 20 $, то прекратить торговлю...
 
перебираешь в истории ордера, сравниваешь время закрытия, тот у которого оно самое большое и есть последний закрытый ордер, тут же узнаешь цену открытия и закрытия и тип ордера ну и в зависимости от типа открытие-закрытие или наоборот будет результат. На форуме поищи уже отвечали и код приводили.
 
Spasibo za otvet, was pois4ul...
 
double Glob(string Name, double DefVal = 0.0)
{
double R = DefVal;
if (GlobalVariableCheck(Name)) R = GlobalVariableGet(Name);
else GlobalVariableSet(Name, R);
return (R);
}

int WaitOrderTimeOut()
{
int tm = Glob("LastTradeTime", LocalTime() + 10)
+ Glob("OrderTimeOut", 10) - LocalTime();
while(tm > 0)
{
Sleep(tm*1000 + MathRand()/32);
tm = Glob("LastTradeTime") + Glob("OrderTimeOut") - LocalTime();
}
GlobalVariableSet("LastTradeTime",LocalTime());
}

По существу нашел только это (по цене открытия - даже лучше). Подходит-ли этот пример, чтобы открывать ордер не раньше чем через 10 мин. А то я пока неочень соображаю... Не мог бы кто-нибудь его пояснить ?
 
посмотри здесь
"OrderCloseTime"
и здесь
"Помогите разобраться с OrderCloseTime"
это если хочешь понять, а если получить готовый ответ, то кроме этого форума смотри на
виаке, пауке, форекссистемс (там готовые куски кода для многих случаев выложены)
пояснения ищи в словаре (иначе не почуствуешь "вкуса" уже разжеванного)
 
Ну что ж, поискал (часика полтора) но увы, ничего конкретного не обнаружил. Поэтому сам настрочил. Суть такая: нужно, чтобы эксперт торговал не раньше, чем через 4 часа от времени открытия последнего ордера. Но важно чтобы разные валютные ордера не ограничивали торговлю (друг друга). Т.е., если ордер на покупку EURUSD был открыт час назад, то не значит, что нельзя открыть ордер на продажу(покупку) GBPUSD раньше, чем через 4 часа. Однако, четырехчасовая разница должна быть учтена в том случае, если ордер пытается открыться по той же валюте (например час назад открылся не EURUSD, a GBPUSD). Для этих целей я использовал разные обозначения для ордеров (через MagicNumber). Отсюда код:


//+------------------------------------------------------------------+
//|                                                      Testing.mq4 |
//|                          Copyright © 2005, BlaBla Software Corp. |
//|                                            http://www.blabla.net |
//+------------------------------------------------------------------+

extern double TakeProfit = 12;
extern double Lots = 0.1;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double a,b;
   int cnt=0, ticket, total, counter;
   string curcur;
   datetime magicTime1,magicTime2;

   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  
     }
     
     a=2;
     b=1;


   total=OrdersTotal();
   
   if(total<10)
     {
      // нет ни одного открытого ордера
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
        
//---------MAX OPEN ORDER TIME FOR MAGIC # BEGIN-----------
    for(counter=1;counter<=20;counter++) //Dopustim v istorii maksimum 20 orderov...
     if(OrderSelect(counter, SELECT_BY_TICKET, MODE_HISTORY)==true)
      {
       if(OrderMagicNumber()==1) //ishem poslednij order EURUSD (Magic Number = 1) samoe pozdnee OrderOpenTime
        {
         if(magicTime1<OrderOpenTime())
            magicTime1=OrderOpenTime(); //magic1 = naibolwemu vremeni
        }     
       if(OrderMagicNumber()==2) //check for GBPUSD (Magic Number = 2) Last OrderOpenTime
        {
         if(magicTime2<OrderOpenTime())
            magicTime2=OrderOpenTime(); //magic2 = MAX time if exists
        }     
      }
      else
       { 
        Print("OrderSelect failed error code is",GetLastError());
       }

  for(counter=1;counter<=10;counter++) //t.k. vsego mozhet bitj otkrito 10 orderov, counter=10
  if(OrderSelect(counter, SELECT_BY_TICKET, MODE_TRADES)==true)
     {
      if(OrderMagicNumber()==1) //to zhe samoe delaem dlja otkritih orderov
       {
        if(magicTime1<OrderOpenTime())
           magicTime1=OrderOpenTime(); //MAX time if exists
       }
      if(OrderMagicNumber()==2) //check for GBPUSD Last OrderOpenTime
       {
        if(magicTime2<OrderOpenTime())
           magicTime2=OrderOpenTime(); //MAX time if exists
       }
     }  
     else
       { 
        Print("OrderSelect failed error code is",GetLastError());
       }
//takim obrazom prosmotreni vse vozmoznie ordera
//---------MAX OPEN ORDER TIME FOR MAGIC # END-----------
        
        
      // проверяем на возможность встать в длинную позицию (BUY)
      if(a>b)
        {
         curcur=Symbol();
         //--------------EURUSD--------------
         if (curcur=="EURUSD" && CurTime()-magicTime1>=14400)
          {
           ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-12*Point,Ask+TakeProfit*Point,"EURUSD",1,0,Green);
          }
         //--------------EURUSD-------------- 
         
         //--------------GBPUSD--------------
         if (curcur=="GBPUSD" && CurTime()-magicTime2>=14400)
          {
           ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,4,Ask-12*Point,Ask+TakeProfit*Point,"GBPUSD",2,0,Green);
          }
         //--------------GBPUSD--------------
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("BUY order opened : ",OrderOpenPrice());
              }
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // проверяем на возможность встать в короткую позицию (SELL) 
      if(b>a)
        {
         curcur=Symbol();
         //--------------EURUSD--------------
         if (curcur=="EURUSD" && CurTime()-magicTime1>=14400)
           {
           ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+12*Point,Bid-TakeProfit*Point,"EURUSD",1,0,Red);
           }
         //--------------EURUSD--------------
         
         //--------------GBPUSD--------------
         if (curcur=="GBPUSD" && CurTime()-magicTime2>=14400)
           {
           ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,4,Bid+12*Point,Bid-TakeProfit*Point,"GBPUSD",2,0,Red);
           }
         //--------------GBPUSD--------------
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("SELL order opened : ",OrderOpenPrice());
              }
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
        
        
      return(0);
     }
     
   return(0);
  }
// конец.



В чем же дело? Код не работает :(

 

for(counter=1;counter<=20;counter++) 



В чем же дело? Код не работает :(



Первый элемент массива имеет индекс = 0 (как в С\С++), а не 1 (как это было в паскале и мкл2) в итоге если ордер единственный он будет пропущен.
Как минимум должно быть :

total=OrdersTotal();
for( counter=0;counter<total;counter++) { 
 
вставь эти две функции в эксперт (или include файл) и сможешь одной строкой определять время открытия, закрытия, последнего в истории , в действии ордера.
//-------------------------------------------------------------------+
// Функция возвращающая время последнего открытого(закрытого) ордера |
// если возвращено -1 (ошибка выполнения), 0-ордера не обнаружено,   |
// положительное значение = искомому времени ордера                  |
//-------------------------------------------------------------------+
int CheckLastOrderTime (string mSymbol, int select, int mode_price)
  //на входе три значения
  //1. наименование инструмента
  //2. смотреть в истории(закрытые) или действующие ордера (соответственно 0 и 1)
  //3. смотреть цену открытия или закрытия (соответственно 0 и 1)
  {
//---- 
   int oTotal=0; //хранит значение количества ордеров (истории или действующие)
   int co; //хранит значение номера текущего ордера
   datetime LastTime=0;
   //проверка корректности переданных функции значений
   if((select>1 || select<0) || (mode_price<0 || mode_price>1))
   {
      Print("Неверно переданные параметры (функция CheckLastOrderTime)");
      return(-1);
   }
   if(select!=1) //если нужно смотреть в истории закрытых ордеров
   {
      oTotal=HistoryTotal();
      for(co=0;co<oTotal;co++) // цикл по ордерам
      {
         if(m_OSelect(co,SELECT_BY_POS,MODE_HISTORY,100)!=-1) //делаем 100 попыток ордер селект
         {
            if(mSymbol==OrderSymbol())
            {
               if(LastTime==0) LastTime=1; //ордер в наличии
               if(mode_price!=1) //если нужно смотреть не время закрытия (открытия)
               {
                  if(LastTime<OrderOpenTime()) LastTime=OrderOpenTime();
               }
               else //иначе смотрим время закрытия
               {
                  if(LastTime<OrderCloseTime()) LastTime=OrderCloseTime();
               }
            }
         }
         else
         {
            Alert("Возникла ошибка , см. журнал!");
            return(-1);
         }
      }
   }
   else //иначе смотрим действующие ордера
   {
      oTotal=OrdersTotal();
      for(co=0;co<oTotal;co++) // цикл по ордерам
      {
         if(m_OSelect(co,SELECT_BY_POS,MODE_TRADES,100)!=-1) //делаем 100 попыток ордер селект
         {
            if(mSymbol==OrderSymbol())
            {
               if(LastTime==0) LastTime=1; //ордер в наличии
               if(mode_price!=1) //если нужно смотреть не время закрытия (открытия)
               {
                  if(LastTime<OrderOpenTime()) LastTime=OrderOpenTime();
               }
               else
               {
                  Alert("Неверно переданный параметр! Ордер еще в действии.");
               }
            }
         }
         else
         {
            Alert("Возникла ошибка , см. журнал!");
            return(-1);
         }
      }
   }
//----
   return(LastTime);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток ордер селект           |
//+------------------------------------------------------------------+
int m_OSelect(int ct, int sel, int pool, int Attempt)
  {
   int i;
//---- 
//ордер селект за Attempt попыток
   for(i=0;i<Attempt;i++)
   {
      if( OrderSelect(ct,sel,pool)==1 ) //если ордер выбран
      {
         Print( "Попытка ордер селект удачна "+OrderTicket() );
         return(1);//завершаем функцию
      }
   }
   Alert( "Код ошибки - "+GetLastError() );
   Alert("Невозможно ордер селект! Сделано "+Attempt+" попыток.");
//---- 
   return(-1);
  }
//-------------------------------------------------------------------------------------------------


писал на скорую руку, поэтому может быть есть ошибки или какие непредвиденные ситуации

 
Sposibo bolwoe, Profi_R!! S mena 20 EURO, kotorie ja zarabotaju na experte :)
 
:)
Причина обращения: