Jump to content
profit777

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

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;
                         }
              } 
     }
}

 

 

Спасибо

Share this post


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

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

Share this post


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

 

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

Share this post


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

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

Share this post


Link to post
Share on other sites
profit777

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

 

 

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

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

 

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

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

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

 

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

 

Спасибо.

Edited by profit777

Share this post


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

 

 

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

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

 

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

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

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

 

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

 

Спасибо.

 

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

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

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

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

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


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

Share this post


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();                    // Запомним лот
                   }
 }
//+------------------------------------------------------------------+


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

Share this post


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(); // Запомним лот

}

}

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


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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×