Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1598

 
Maxim Kuznetsov:

просто добавление, НЕ ГАРАНТИРУЕТСЯ что терминал имеет и отдаст достаточную историю.

в примере выше нет обращения к истории

поэтому гарантируется, если результат OrderSelect() будет true

UPD: OrderSelect  в 4-ке очень хорошо работает, тестировал когда то - для рыночных ордеров время обращения к сврйствам ордеров.... реально миллионы раз в секунду, не охота искать, кажется с модератором Артемом спорил, но тут как говорится "на вкус все фломастеры разные", нравится - храните

 

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

Может кто встречал скрипт, сбора такой статистики и вывода в виде отчета?

спасибо

 
законопослушный гражданин:

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

Может кто встречал скрипт, сбора такой статистики и вывода в виде отчета?

спасибо

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

написано "с руки", не проверялось, изобилует ошибками :-) подправьте под свои нужды и пользуйтесь

 
Maxim Kuznetsov:

for(int i=OrdersTotal()-1;i>=0;i--) {

   if (!OrderSelect(i,SELECT_BY_POSITON,MODE_TRADES)) continue;

   double prosad=DBL_MIN;

   if (OrderType()!=OP_BUY && OrderType!=OP_SELL) continue;

   for(int j=iBarShift(OrderSymbol(),OrderOpenTime(),PERIOD_M1); j>=0;j--) {

      double delta=( OrderType()==OP_BUY? OrderOpenPrice()-iLow(OrderSymbol(),PERIOD_M1,j) : iHigh(OrderSymbol(),PERIOD_M1,j)-OrderOpenPrice() );

      delta /= MarketInfo(OrderSymbol(),MODE_POINT);

      if (delta>prosad) prosad=delta;

   }

  PrintFormat("Максимальная просадка по ордеру %d = %d пунктов , %f денег",OrderTicket(),(int)(prosad),prosad*OrderLots()*MarketInfo(OrderSymbol(),MODE_TICKVALUE);

}

написано "с руки", не проверялось, изобилует ошибками :-) подправьте под свои нужды и пользуйтесь

спасибо, попробую разобраться!

 
@Igor Makanu, большое спасибо за ответы по поводу сортировки ордеров в терминале. Я, пожалуй, сохраню их как массив структур и отсотирую его самостоятельно. Сомнения были главным образом потому, что я опасался, что такие действия, выполняемые на каждом тике, окажут заметное негативное влияние на производительность.
 
Janis Ozols:
@Igor Makanu, большое спасибо за ответы по поводу сортировки ордеров в терминале. Я, пожалуй, сохраню их как массив структур и отсотирую его самостоятельно. Сомнения были главным образом потому, что я опасался, что такие действия, выполняемые на каждом тике, окажут заметное негативное влияние на производительность.

Так а зачем сортировать на каждом тике? Достаточно только при изменении количества записей или полного изменения списка…

 
Добрый день Помогите пожалуйста разобраться, почему загруженный индикатор из навигатора не перетаскивается на график. В каталоге он есть.
Файлы:
image002.jpg  38 kb
 
Добрый день. Если не происходит автоматическая загрузка инструмента индикатора из маркета в торговый терминал, то в чем дело? 
 
Igor Makanu:

в примере выше нет обращения к истории

поэтому гарантируется, если результат OrderSelect() будет true

UPD: OrderSelect  в 4-ке очень хорошо работает, тестировал когда то - для рыночных ордеров время обращения к сврйствам ордеров.... реально миллионы раз в секунду, не охота искать, кажется с модератором Артемом спорил, но тут как говорится "на вкус все фломастеры разные", нравится - храните

Модератор Артем не спорит. Модератор Артем дискутирует :)
 
void OnTick()
  {
    if(isCrossing() == 1)          
      
    ... 

    if(isCrossing() == 2)
      
    ... 
  }

int isCrossing(){  
  double ma = iMA(NULL, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maApplietPrice, 0);
  double low = iLow(Symbol(), g_timeFrame, 0);
  double high = iHigh(Symbol(), g_timeFrame, 0);

  if(g_barTime < iTime(NULL,g_timeFrame,0) && high > ma && Bid <= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 1;
  } 
  
  if(g_barTime < iTime(NULL,g_timeFrame,0) && low < ma && Bid >= ma){
    g_barTime = iTime(NULL,g_timeFrame,0);
    return 2;
  }
   
  return 0;
}
Почему isCrossing() не возвращает 2 ??? В самом isCrossing() есть вход во второй if, но потом в OnTick() не происходит вхождения в if, когда isCrossing() == 2. Что за бред...
Причина обращения: