Jump to content

определение лотности


Recommended Posts

profit777

Здравствуйте.

Есть два закрытых ордера - один бай один селл

Можно ли таким методом определить лотность и профит последних двух закрытых ордеров среди которых один бай один сел. и присвоить значения Oder_Profit_B Oder_Profit_S Lot_B Lot_S. Ордера могут идти в разном порядке.

 

 

if (OrdersHistoryTotal()>0)
  {  

  for (int i=1; i>=0; i--)
     {
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))  
              if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
                  if   (OrderType()== OP_BUY)
                         {
                         Oder_Profit_B = NormalizeDouble (OrderProfit(),Digits);
                         Lot_B = OrderLots();
                         break;
                         }
                  else if (OrderType()== OP_SELL)
                         {
                         Oder_Profit_S = NormalizeDouble (OrderProfit(),Digits);
                         Lot_S = NormalizeDouble (OrderLots(),Digits);
                         break;
                         }
              } 
     }
}

 

 

Спасибо

Link to post
Share on other sites
Circle
Здравствуйте.

Есть два закрытых ордера - один бай один селл

Можно ли таким методом определить лотность и профит последних двух закрытых ордеров среди которых один бай один сел. и присвоить значения Oder_Profit_B Oder_Profit_S Lot_B Lot_S. Ордера могут идти в разном порядке.

 

......

 

Спасибо

 

Так нельзя.

int GetLastCloseOrderTicket(int MN,string Smb)
{
  datetime tclose=0;
  int i=0,ticket=0;
  for (i=0; i<OrdersHistoryTotal(); i++) 
  {
     if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
     if (MN!=0) 
        if (OrderMagicNumber()!=MN) continue;
     if (OrderSymbol()!=Smb) continue;
     if (tclose<OrderCloseTime())
     {
        tclose=OrderCloseTime();
        ticket=OrderTicket();         
     }
  }
  if (OrderSelect(ticket,SELECT_BY_TICKET)) return(OrderTicket());
  else return(-1);
}

Функция возвращает тикет последнего закрытого ордера если такого нет то -1

Edited by Circle

Что такое форекс? Это там где деньги лежат. 

Link to post
Share on other sites
profit777
Так нельзя.

 

и даже при двух проходах цикла? Спасибо

Link to post
Share on other sites
Circle
и даже при двух проходах цикла? Спасибо

 

Судя по вашему коду цикл у вас будет выполнятся пока не найдет первый попавшийся закрытый ордер, а вот когда он был закрыт неизвестно и после чего оператором break у вас будет выход из цикла. Вообщем фигня получится.

...

Вот пример использования функции что я вам предложил.

int Magik = 1234;

int Ticet = GetLastOrderTicet(Magik,"EURUSD");

if (Ticet>0)

{

if (OrderType()==OP_SELL)

{

double lotSell = OrderLost();

double ProfitSell = OrderProfit();

}

if (OrderType()==OP_BUY)

{

double lotBuy = OrderLost();

double ProfitBuy = OrderProfit();

}

 

}

P.S.

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

Edited by Circle

Что такое форекс? Это там где деньги лежат. 

Link to post
Share on other sites
profit777

Может такого и действительно не реально сделать...

 

 

А может не правильно описал...

Проблемка в том что открывается 2 ордера... и закрывается два...(с тикетами напутаю) и вот уже в истории из этих последних двух ордеров нужно вытащить лотность и профит ... это можно сделать циклом?

 

я старался описать такую процедуру

1) Выбираем последний закрытый ордер из истории и если он бай то заполняем лотность и профит для бая а если нет то заполняем сел

2) При следующем проходе цыкла выбирается уже второй ордер в истории (предпоследний закрытый) если он бай то заполняем лотность и профит для бая а если нет то заполняем сел

 

В любом случае среди последних двух есть один бай и один сел.

 

Спасибо.

Edited by profit777
Link to post
Share on other sites
Circle
Может такого и действительно не реально сделать...

 

 

А может не правильно описал...

Проблемка в том что открывается 2 ордера... и закрывается два...(с тикетами напутаю) и вот уже в истории из этих последних двух ордеров нужно вытащить лотность и профит ... это можно сделать циклом?

 

я старался описать такую процедуру

1) Выбираем последний закрытый ордер из истории и если он бай то заполняем лотность и профит для бая а если нет то заполняем сел

2) При следующем проходе цыкла выбирается уже второй ордер в истории (предпоследний закрытый) если он бай то заполняем лотность и профит для бая а если нет то заполняем сел

 

В любом случае среди последних двух есть один бай и один сел.

 

Спасибо.

 

Я вам вроде в личку писал ответ. Может у вас переполнен "ящик" личных сообщений.

В исходящих ответ почему то не сохранился.

Там я вам предложил поместить все ордера в массив и отсортировать их по времени закрытия ордера.

Тогда у вас первый ордер в массиве будет последним закрытым, а второй соответственно предпоследним.

Ни чего другого на ум не приходит.


Что такое форекс? Это там где деньги лежат. 

Link to post
Share on other sites
Voldemar227

понимаю что поздно но мож кому пригодиться

 

//+------------------------------------------------------------------+
//|                                                       123456.mq4 |
//|                     "Copyright 2013, [url]*[/url] Project." |
//|                                       "http://*" |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, [url]*[/url] Project."
#property link      "http://*"
#property strict
input int Magic=0; // Меджик номер
//+------------------------------------------------------------------+
int OnInit()  {   Comment("");   return(INIT_SUCCEEDED);  }
//+------------------------------------------------------------------+
void OnTick()
 {
  double buylastlot=0,buylastprofit=0,sellastlot=0,sellastprofit=0; // создадим и обнулим на каждом тике переменные

  history(OP_BUY ,buylastlot,buylastprofit); // Вызов функции для закрытых бай ордеров
  history(OP_SELL,sellastlot,sellastprofit); // Вызов функции для закрытых сел ордеров

// проверим результат
Comment(
"\n","Last Buy",
"\n","Last lot ",DoubleToStr(buylastlot,2),
"\n","Last profit ",DoubleToStr(buylastprofit,2),
"\n",
"\n","Last Sell",
"\n","Last lot ",DoubleToStr(sellastlot,2),
"\n","Last profit ",DoubleToStr(sellastprofit,2)
);
 }
//+------------------------------------------------------------------+
void history(const int      typ, // Принимает тип ордера
            double        &lot, // Принимает переменную для сохранения лота
            double     &profit  // Принимает переменную для сохранения профита
            )
 {
  datetime time= 0;                                     // Обнулим переменную тайм
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)          // запустим цикл перебора ордеров по истории начиная с последнего
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))      // Разбор исторического ордера
        if(OrderMagicNumber()==Magic)                   // Если по нашему меджику
           if(OrderSymbol()==_Symbol)                   // Если по нашему символу
              if(OrderType()==typ)                      // Если по нашему типу ордера
                 if(OrderCloseTime()>time || time==0)   // если последний по времени
                   {
                    time=OrderCloseTime();              // Запомним время
                    profit=OrderProfit();               // Запомним профит
                    lot=OrderLots();                    // Запомним лот
                   }
 }
//+------------------------------------------------------------------+


Трейдер и программист ...     Мой блог     Мой профиль

Link to post
Share on other sites
Circle
понимаю что поздно но мож кому пригодиться

 

 

......

void history(const int typ, // Принимает тип ордера

double &lot, // Принимает переменную для сохранения лота

double &profit // Принимает переменную для сохранения профита

)

{

datetime time= 0; // Обнулим переменную тайм

for(int i=OrdersHistoryTotal()-1; i>=0; i--) // запустим цикл перебора ордеров по истории начиная с последнего

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) // Разбор исторического ордера

if(OrderMagicNumber()==Magic) // Если по нашему меджику

Зачем все остальные проверки если это не наш магик? Для оптимизации скорости выполнения кода лучше будет

if(OrderMagicNumber()!=Magic) continue;

и т.д. для других условных операторов.

if(OrderSymbol()==_Symbol) // Если по нашему символу

if(OrderType()==typ) // Если по нашему типу ордера

if(OrderCloseTime()>time || time==0) // если последний по времени

{

time=OrderCloseTime(); // Запомним время

profit=OrderProfit(); // Запомним профит

lot=OrderLots(); // Запомним лот

}

}

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


Что такое форекс? Это там где деньги лежат. 

Link to post
Share on other sites
  • Capman locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...