Jump to content

Общие вопросы по языку MQL


Recommended Posts

torgf

Как получить значения линий сетки  Фибоначчи, натянутой по первым  фракталам?
В переменных LOWER, UPPER, значения фракталов.

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

Ну, в данном случае мне стоило бы сразу соблюдать простейшие приёмы защитного программирования, то есть проверять, не равна ли нулю переменная, оказавшаяся под знаком деления. Ведь она "чужая", то ест

На счёт проверок, это правильно. Я больше очень практикую, то же нарывался. Но в моём случае у меня советник открывал ордер минимальным лотом вместо нормального, когда замечал, доливаться было поздно.

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

Ugar68
18 часов назад, torgf сказал:

Как получить значения линий сетки  Фибоначчи, натянутой по первым  фракталам?
В переменных LOWER, UPPER, значения фракталов.

Надо разместить объект https://docs.mql4.com/ru/objects/objectcreate

Потом получить данные линий. https://docs.mql4.com/ru/objects/objectgetdouble

Ну а если надо что бы без самого объекта, то считать уровни.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf

Такая задачка: пометить на истории каждый верхний фрактал из трёх первых, отсчёт от N бара, если текущая цена равна цене фрактала и максимальная цена на отрезке от текущего бара до фрактала равного текущей цене, больше 100 пунктов. Подскажите, пожалуйста, как действовать.

Edited by torgf
Link to post
Share on other sites
Ugar68
10 часов назад, torgf сказал:

Такая задачка: пометить на истории каждый верхний фрактал из трёх первых, отсчёт от N бара, если текущая цена равна цене фрактала и максимальная цена на отрезке от текущего бара до фрактала равного текущей цене, больше 100 пунктов. Подскажите, пожалуйста, как действовать.

Что бы не запутаться, лучше делать всё по очереди.

1. Перебирая бары в цикле от N искать 3 фрактала вызовом iFractals. Номера баров найденных загнать в массив.

2. Перебирая найденные фракталы в цикле искать тот что совпадает с текущей ценой. Если найден такой загнать его номер бара в переменную.

3. Найти бар с максимальной ценой от 0 до номера бара в переменной с помощью iHighest.

4. Посчитать разницу в цене от High найденного максимального бара до текущей цены.

Можно конечно всё загнать в один цикл, но это может запутать.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf

Спасибо.

Скажите, пожалуйста, какая последовательность действий при реализации в одном цикле.

Постараюсь не запутаться😊

Link to post
Share on other sites
Ugar68
17 часов назад, torgf сказал:

Спасибо.

Скажите, пожалуйста, какая последовательность действий при реализации в одном цикле.

Постараюсь не запутаться😊

Перебирая бары в цикле от текущего бара искать максимальную цену, начиная с N бара искать фрактал, вызывая iFractals, который совпадёт с текущей ценой. Если нашлось 3 фрактала, но ни один не подошёл - прервать цикл.

Если нашёлся фрактал совпадающий с текущей ценой - поднять флаг найденного фрактала и прервать цикл. При этом максимальная цена уже найдена.

Если после цикла флаг найденного фрактала поднят, посчитать разницу от найденного максимума до текущей цены.

 

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf

Спасибо. Вроде бы всё сделала по плану, только проверку до максимума поместила внутри цикла, иначе, не до всех трёх фракталов ищем максимум. 

Что неправильно?

         for(int i_i=i; i_i<limit; i_i++)
           {
            if(high_old<high[i_i]) high_old=high[i_i];

            if(i_i>=_N)//начиная с N бара ищу фракталы
              {
               f=iFractals(Symbol(),0,MODE_UPPER,i_i);
               if(f>0)//Если фрактал найден
                 {
                  kfr_all++;//счётчик фракталов
                  if(Low[i]<f && High[i]>f && //Сравнение фрактала с текуще ценой
                  kfr_all<=3 //3
                  && 
                  high_old-f>=100*Point//от максимума до фрактала 100 пп
                  )
                  {
                  bingob=true;
                  break;
                  }
                  if(kfr_all==3)break;
                 }
              }
           }

      if(bingob)
      {
      BufferPointUp[i]=low[i];
      bingob=false; 
      }

 

Link to post
Share on other sites
Ugar68

По условию вроде не надо было искать максимум до всех трёх фракталов искать. Надо же было искать только до того который совпал с текущей ценой.

Что для Вас текущая цена?

if(Low[i]<f && High[i]>f && //Сравнение фрактала с текуще ценой

Я считал что текущая цена это Bid.

  • Upvote 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
17 часов назад, Ugar68 сказал:

Я считал что текущая цена это Bid.

Так в индикаторе при использовании Bid ничего на истории не строится, или это только у меня)

Вообще, замысел такой- Номер бара, от которого ищу фракталы это бар первого фрактала сформированного выше МА. В основном цикле запоминаю его время в "time_n_vernif", поднимаю флаг чтобы первый фрактал выше МА оставался в переменной, потом _N=iBarShift(NULL,PERIOD_CURRENT,time_n_vernif,true)-i; и от _N ищу на трёх фракталах, включая первый фрактал сформированный выше МА, равенство текущей цене, то есть если текущий бар, в любое время был равен цене фрактала то заполнить буфер. Возможно, как всегда, усложняю) Подскажите если есть более простое решение.

Edited by torgf
Link to post
Share on other sites
Ugar68

На текущем баре, текущая цена это Bid=close[0]. На истории текущей ценой могла быть любая от Low до High включительно.

if(Low[i]<f+0.5*_Point && High[i]>f-0.5*_Point

И я ещё не понял зачем запоминать время фрактала, а потом искать номер его бара. Почему бы сразу не запомнить номер бара фрактала? Хотя, возможно я не вижу картину целиком. Я обычно запоминаю время фрактала, только если нужно использовать его на другом тике, так как номер бара может измениться.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
7 часов назад, Ugar68 сказал:

И я ещё не понял зачем запоминать время фрактала, а потом искать номер его бара. Почему бы сразу не запомнить номер бара фрактала? Хотя, возможно я не вижу картину целиком. Я обычно запоминаю время фрактала, только если нужно использовать его на другом тике, так как номер бара может измениться.

Спасибо. Нет ли возможности в текущее время узнать на каком баре, от текущего, сформировался первый верхний фрактал выше МА. чтобы от него дальше в историю искать из трёх фракталов равный любой цене текущего бара и параллельно искать максимальную цену.

Полная картина, так сказать, на рисунке. Текущая цена равна фракталу 2, фрактал 1- это первый фрактал выше МА

aaqqaa.jpg

Link to post
Share on other sites
Ugar68

Всё то же самое, только добавляется МА.

Перебирая бары в цикле от текущего бара искать максимальную цену, и первый фрактал, вызывая iFractals, и МА вызывая iMA. Как только фрактал выше МА, счётчик фракталов задать 1. Далее искать фракта арка не найдётся тот  который совпадёт с текущей ценой. Если нашлось 3 фрактала, но ни один не подошёл - прервать цикл.

Если нашёлся фрактал совпадающий с текущей ценой - поднять флаг найденного фрактала и прервать цикл. При этом максимальная цена уже найдена.

Я не понял, на картинке у Вас есть ещё фрактал правее и он выше МА.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
14 часов назад, Ugar68 сказал:

... на картинке у Вас есть ещё фрактал правее и он выше МА.

Да, в этом и дело, относительно текущего бара это третий, он может быть и пятый и десятый фрактал, но он первый после того как цена перешла выше МА. Как, в текущее время узнать что он первый выше МА?

И наверное, нужно сразу проверять расстояние до макс, а то один фрактал найдём равный цене, выйдем из цикла а от него до макс цены меньше 100, от остальных может было 100 пп )

Edited by torgf
Link to post
Share on other sites
Ugar68

Значит я не до конца понял. Тогда немного меняем начало, оно будет выглядеть так:

Для начала надо точно определиться что такое текущая цена выше МА или ниже МА и описать это в условии.

Перебирая бары в цикле от текущего бара искать максимальную цену, и первый фрактал, вызывая iFractals.

Если нашёлся проверить выше ли текущая цена МА, если нет забыть этот фрактал искать дальше.

Если выше то запомнить бар фрактала. Предварительно считать его нулевым.

Далее искать фракталы и максимальную цену и проверять текущую цену относительно МА.

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

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


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
13 часов назад, Ugar68 сказал:

Для начала надо точно определиться что такое текущая цена выше МА или ниже МА и описать это в условии.

 

Понятно у меня не получается сформулировать☺️

Текущая цена относительно МА, не имеет значения. Важно что цена фрактала выше МА то есть предыдущий фрактал был ниже МА, позже сформировался фрактал выше МА, вот он и есть первый.

13 часов назад, Ugar68 сказал:

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

Не понимаю. Счётчику присвоить 1, а как дальше считать?

Изобразила, сначала цена равна второму из искомых фракталов, позже первому.

Эти условия и пытаюсь зафиксировать.

fr1234.JPG

Edited by torgf
Link to post
Share on other sites
Ugar68

Перебирая бары в цикле от текущего бара искать максимальную цену, и первый фрактал, вызывая iFractals.

Если нашёлся проверить выше ли фрактал МА, если нет забыть этот фрактал искать дальше.

Если выше то запомнить бар фрактала. Предварительно считать его нулевым.

Далее искать фракталы и максимальную цену и проверять фрактал относительно МА.

Если нашёлся новый фрактал, но он не стал ниже МА, забыть прошлый фрактал и считать нулевым новый найденный. Так же забыть найденный максимум. и искать снова фрактал и максимум проверяя фрактал относительно МА.

Если найден фрактал ниже МА, значит найденный ранее нулевой фрактал считать первым, а новый вторым.

Проверить совпадает ли какой то из них с текущей ценой, если нет искать 3 фрактал...

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

По этому, я сразу и писал что лучше задачу решать последовательно, а не всё сразу в одном цикле.

Во всяком случае, поиск максимума лучше вынести из цикла, разве что если Вам надо несколько максимумов, тогда да, там ему и место.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf

Спасибо, нашла ☺️.

Можно, как нибудь, узнать первоначальный размер лота позиции закрытой по частям. Например лот 0.3 закрыт по рынку дважды 0.1 и 0.1, остаток закрылся по стоп лосс. Как узнать что был лот 0.3?

Эта функция возвращает лот последней части позиции

double GetLotLastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderCloseTime()) {
                o=OrderCloseTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}

 

Edited by torgf
Link to post
Share on other sites
Ugar68

При частичном закрытии на в МТ4 Альпари меняется тикет и комментарий. Можно проследить по истории цепочку закрываемых ордеров по тикетам и комментариям. Но это будет работать только у тех брокеров, которые выполняют частичное закрытие так же. Гораздо проще и универсальнее, если нужен начальный лот, запомнить его в GV или файле.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf

Спасибо, а нет ли примера закрытия позиции по частям в mql5. 

Link to post
Share on other sites
Ugar68

Пятёрка менее популярна, и программы для неё заказывают реже. Мне пока не приходилось писать частичное закрытие позиций. Но думаю что оно мало отличается от полного закрытия, лот другой. Возможно AntFX поможет. Если он писал корректировщик объёмов для пятёрки, наверняка там частичное закрытие выполнял.

  • Upvote 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
tyrbo924

Здрасте всем! Ребят помогите. Данный советник почему то на центовом работать не хочет, должен закрывать накопленные сделки в одном месте и выставлять стопы. После появления пятого знака переделали работал на стандарте. На центе не работает. 

 

//+------------------------------------------------------------------+
//|                                                     франк_уд.mq4 |
//+------------------------------------------------------------------+
#define m  20050612
//----
extern int tp = 37;
extern int sh = 25;
//----
datetime lastt; 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int kol_buy()
  {
   int kol_ob = 0;
//----
   for(int i = 0; i < OrdersTotal(); i++)
     {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) 
           break;
       //----
       if(OrderType() == OP_BUY)  
           kol_ob++;
     }
   return(kol_ob);
  }    
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int kol_sell()
  {
   int kol_os = 0;
//----
   for(int i = 0; i < OrdersTotal(); i++)
     {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) 
           break;
       //----
       if(OrderType() == OP_SELL)  
           kol_os++;
     }
   return(kol_os);
  } 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int slip, i, ii, tic, total, kk, gle;
   double lotsi = 0.000;
   bool sob = false, sos = false, scb = false, scs = false;
   int kb, kb_max = 0;
   kb = kol_buy() + 1;
   double M_ob[11][8];
   ArrayResize(M_ob,kb);
   int ks = 0, ks_max = 0;
   ks = kol_sell() + 1;
   double M_os[11][8];
   ArrayResize(M_os,ks);
   ArrayInitialize(M_ob, 0.00);
   int kbi = 0;
   double Point_ = Point*10;
//----
   for(i = 0; i < OrdersTotal(); i++)
     {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) 
           break;
       //----
       if(OrderSymbol() == Symbol() && OrderType() == OP_BUY)
         {
           kbi++;
           M_ob[kbi][0] = OrderTicket();
           M_ob[kbi][1] = OrderOpenPrice();
           M_ob[kbi][2] = OrderLots();
           M_ob[kbi][3] = OrderType();
           M_ob[kbi][4] = OrderMagicNumber();
           M_ob[kbi][5] = OrderStopLoss();
           M_ob[kbi][6] = OrderTakeProfit();
           M_ob[kbi][7] = OrderProfit();
         }
     } 
   M_ob[0][0] = kb; 
   double max_lot_b = 0.000;
//----
   for(i = 1; i < kb; i++)
       if(M_ob[2] > max_lot_b)
         {
           max_lot_b = M_ob[2];
           kb_max = i;
         }
   double buy_lev_min = M_ob[kb_max][1];   
   ArrayInitialize(M_os,0.00);
   int ksi = 0;
//----
   for(i = 0; i < OrdersTotal(); i++)
     {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) 
           break;
       //----
       if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
         {
           ksi++;
           M_os[ksi][0] = OrderTicket();
           M_os[ksi][1] = OrderOpenPrice();
           M_os[ksi][2] = OrderLots();
           M_os[ksi][3] = OrderType();
           M_os[ksi][4] = OrderMagicNumber();
           M_os[ksi][5] = OrderStopLoss();
           M_os[ksi][6] = OrderTakeProfit();
           M_os[ksi][7] = OrderProfit();
         }
     } 
   M_os[0][0] = ks; 
   double max_lot_s = 0.000;
//----
   for(i = 1;i < ks; i++)
       if(M_os[2] > max_lot_s)
         {
           max_lot_s = M_os[2];
           ks_max = i;
         }
   double sell_lev_max = M_os[ks_max][1];    
//----
   if(Bars < 100 || IsTradeAllowed() == false) 
       return(0); 
   sob = (kol_buy() < 1 || buy_lev_min - sh*Point_ > Ask) && 
          AccountFreeMargin() > AccountBalance()*0.5;
   sos = (kol_sell() < 1 || sell_lev_max + sh*Point_ < Bid) &&
          AccountFreeMargin() > AccountBalance()*0.5;
//----
   if(M_ob[kb_max][2] > 0.00)
       scb = M_ob[kb_max][7] / (M_ob[kb_max][2]*10) > tp;
//----
   if(M_os[ks_max][2] > 0.00)
       scs = M_os[ks_max][7] / (M_os[ks_max][2]*10) > tp;
   kk = 0;
   ii = 0;
//----
   if(scb)
     {
       while(kol_buy() > 0 && kk < 3)
         {
           for(i = 1; i <= kb; i++)
             {
               ii = M_ob[0];
               //----
               if(!OrderClose(ii,M_ob[2],Bid,slip,White)) 
                 {
                   gle = GetLastError();
                   kk++;
                   Print("Ошибка №", gle, " при close buy ", kk);
                   Sleep(6000);
                   RefreshRates();  
                 }
             }
           kk++;
         }
     }
   kk = 0;  
   ii = 0; 
//----
   if(scs)
     {
       while(kol_sell() > 0 && kk < 3)
         {
           for(i = 1; i <= ks; i++)
             {
               ii = M_os[0];
               //----
               if(!OrderClose(ii,M_os[2], Ask, slip, White))
                 {
                   gle = GetLastError();
                   kk++;
                   Print("Ошибка №", gle, " при close sell ", kk);
                   Sleep(6000);
                   RefreshRates();  
                 }
             }
           kk++;
         }
     }
   kk = 0; 
   tic = -1;  
//----
   if(sob) 
     {
       if(max_lot_b == 0.00)
           lotsi = 0.01;
       else 
           lotsi = 2.0*max_lot_b;
       //----
       while(tic == -1 && kk < 3)
         {
           tic = OrderSend(Symbol(), OP_BUY, lotsi, Ask, slip, 0, Ask + (tp + 25)*Point_, 
                           " ", m, 0, Yellow);
           Print("tic_buy=", tic);
           //----
           if(tic==-1)
             {
               gle = GetLastError();
               kk++;               
               Print("Ошибка №", gle, " при buy ", kk);
               Sleep(6000);
               RefreshRates();   
             }
         }   
       lastt = CurTime();
       return;
     }
   tic = -1;
   kk = 0;  
//----
   if(sos) 
     {
       if(max_lot_s == 0.00)
           lotsi = 0.01;
       else 
           lotsi = 2.0*max_lot_s;
       //----
       while(tic == -1 && kk < 3)
         {
           tic = OrderSend(Symbol(), OP_SELL, lotsi, Bid, slip, 0, Bid - (tp + 25)*Point_,
                           " ", m, 0, Red);
           Print("tic_sell=", tic);
           //----
           if(tic == -1)
             {
               gle = GetLastError();
               kk++;               
               Print("Ошибка №", gle, " при sell ", kk);
               Sleep(6000);
               RefreshRates();   
             }
          }
       lastt = CurTime();
       return;
     }        
  }
//+------------------------------------------------------------------+   


Умничать и быть умным - разные понятия!

Link to post
Share on other sites
torgf
В 19.09.2018 в 08:00, Ugar68 сказал:

 

Понятно☺️

Помогите на mql5 найти номер бара закрытия последней позиции.

.На mql4 так:

int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}

 

Edited by torgf
Link to post
Share on other sites
AntFX
2 часа назад, torgf сказал:

Помогите на mql5 найти номер бара закрытия последней позиции.

На mql5 почти также, только нужно искать последнюю сделку со свойством "out", то есть выход из рынка (что то же самое, что закрытие позиции).

 

void OnStart(){ 
   int bar=LastDealCloseBarMT5();
   if(bar>=0){ Print("Найдено время закрытия последней сделки: ", 
                          TimeToString(iTime(Symbol(), PERIOD_CURRENT, bar))," номер бара ", bar); }}

int LastDealCloseBarMT5(string sy="", ENUM_TIMEFRAMES tf=PERIOD_CURRENT, int op=-1, int mn=-1){
  HistorySelect(0, TimeCurrent()); // В МТ5 сначала нужно выбрать историю (от начала времен до текущего момента)

  datetime t=0;
  int      i, k=HistoryDealsTotal(); // Всего сделок в истории
  ulong    d=0;

  if(sy=="")  sy=Symbol();

  for(i=k-1; i>=0; i--){ // Начнем сразу с конца, чтобы получить первым же подходящим вариантом нужную сделку
    if((d=HistoryDealGetTicket(i))>0){ // Выберем сделку по номеру и получим её тикет
      if(HistoryDealGetString(d, DEAL_SYMBOL)==sy){ // Нужный нам символ
        if(HistoryDealGetInteger(d, DEAL_ENTRY)==DEAL_ENTRY_OUT){ // Убедимся, что этой сделкой совершался ВЫХОД ИЗ РЫНКА 
                                                                    // (другими словами, закрытие позиции)
          if(op<0 || (op==0 && HistoryDealGetInteger(d, DEAL_TYPE)==DEAL_TYPE_SELL) // Если нужно закрытие покупки - то это продажа
                  || (op==1 && HistoryDealGetInteger(d, DEAL_TYPE)==DEAL_TYPE_BUY)){ // Если нужно закрытие продажи - то это покупка
            if(mn<0 || HistoryDealGetInteger(d, DEAL_MAGIC)==mn) { // Номер советника
               t=(datetime)HistoryDealGetInteger(d, DEAL_TIME); Print("Нашли сделку ", d); break; }}}}}} 
                     // Получили время нужной сделки и вышли из цикла
               
  return(t>0?iBarShift(sy, tf, t, true):-1); } // Вернем номер бара или неудачу

 

Edited by AntFX
  • Thanks 1

1

Link to post
Share on other sites
AntFX
В 19.09.2018 в 04:33, torgf сказал:

Спасибо, нашла ☺️.

Можно, как нибудь, узнать первоначальный размер лота позиции закрытой по частям. Например лот 0.3 закрыт по рынку дважды 0.1 и 0.1, остаток закрылся по стоп лосс. Как узнать что был лот 0.3?

Сначала нужно узнать номер позиции, для этого нужно получить свойство сделки HistoryDealGetInteger(DEAL_POSITION_ID) или свойство ордера HistoryOrderGetInteger(ORDER_POSITION_ID)

Затем нужно выбрать историю этой позиции в ордерах и сделках HistorySelectByPosition(POSITION_ID), используя полученный номер

Теперь можно выбирать сделки со свойством IN (то есть вход в рынок) и анализировать их объемы и последовательность. Ведь все может быть не так просто, как - сначала открыли 0.3, а потом закрывали по 0.1. А может быть, открывали 7 раз по 0.1, потом закрыли 3 раза по 0.2, потом открыли 2 раза по 0.3 и т.д. и все в пределах одной и той же позиции... В МТ5 "частичное открытие и закрытие" это более "простое" и естественное понятие, чем в МТ4 с его жесткой привязкой к ордерам.

Edited by AntFX

1

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...