Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1026

 
Vladimir Karputov:

Суть не меняется - Вы на каждом тике пытаетесь удалить отложенный ордер с тикетом "0".

А кто сказал, что у Вас на каждом тике есть отложенный ордер с тикетом 0? А Вы проверили, вообще сколько отложенных ордеров? А откуда Вы взяли, что ....?

С каким тикетом "0"??? OrderGetTicket(0) не означает что выбран ордер с тикетом 0, а возвращает тикет ордера из списка отложенных ордеров под индексом 0.

 
ascerdfg:


Вероятно Вам необходимо более точно сформулировать задачу.

Например так: если есть отложенный ордер у которого magic равен "1" - тогда удалить его.

В таком случае реализация будет такой:

#include <Trade\Trade.mqh>

CTrade trader;
int OnInit()
  {

   trader.SetExpertMagicNumber(1);

   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
//---
  
  }
void OnTick()
  {
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(OrderGetTicket(i)>0)     // selects the pending order by index for further access to its properties
         if(OrderGetInteger(ORDER_MAGIC)==1)
            trader.OrderDelete(OrderGetTicket(i));
  }

Обход в цикле всех отложенных ордеров

   Если удалось выбрать отложенный ордер (возвращаемое значение - тикет больше нуля)

      Если magic выбранного отложенного ордера равен "1"

         Удалить его

 
Alexey Viktorov:

С каким тикетом "0"??? OrderGetTicket(0) не означает что выбран ордер с тикетом 0, а возвращает тикет ордера из списка отложенных ордеров под индексом 0.

Да, точно.

 

Подскажите, сколько оперативки нужно чтобы прогнать в тестере 30 символов с 2004-го по сегодня?

Тестер пишет, что не хватает, но сколько нужно - не пишет.

 
Igor Zakharov:

Подскажите, сколько оперативки нужно чтобы прогнать в тестере 30 символов с 2004-го по сегодня?

Тестер пишет, что не хватает, но сколько нужно - не пишет.

Прогоните два символа, пять символов ... 

 
Vladimir Karputov:

Прогоните два символа, пять символов ... 

Вопрос не совсем в этом - сколько памяти нужно докупить, чтоб сделать такой тест возможным?

вот результат по одному символу (из лога в режиме по ценам открытия)

264 Mb memory used including 6 Mb of history data, 64 Mb of tick data

вот 2:

271 Mb memory used including 12 Mb of history data, 64 Mb of tick data

3:

1038 Mb memory used including 12 Mb of history data, 832 Mb of tick data

А вот 4:

1450 Mb memory used including 18 Mb of history data, 1216 Mb of tick data

По экспоненте пошло :) Логики не прослеживаю, т.к. тиков примерно одинаково:

EURUSD,H1: 21470549 ticks, 94233 bars generated. 63097850 total ticks for all symbols
EURUSD: generate 21470549 ticks in 0:00:05.375, passed to tester 21470549 ticks
USDCAD: generate 20302871 ticks in 0:00:05.062, passed to tester 20302871 ticks
USDJPY: generate 21324430 ticks in 0:00:05.641, passed to tester 21324430 ticks
1450 Mb memory used including 18 Mb of history data, 1216 Mb of tick data

Я много раз видел отчёты по 20ти и больше символам, не верится, что кто-то терабайтами оперативку использует. Может секрет какой есть?

 

Есть ли возможность в индикаторе настройками устанавливать число графических буферов?

И сразу второй вопрос, есть ли возможность принудительной переинициализации индикатора, используемого советником с целью экономии ОЗУ?

 
Aleksey Vyazmikin:

Есть ли возможность в индикаторе настройками устанавливать число графических буферов?

И сразу второй вопрос, есть ли возможность принудительной переинициализации индикатора, используемого советником с целью экономии ОЗУ?

Заявленное в #property indicator_plots уменьшить можно, это я делал. А вот увеличить вряд-ли получится. Но это уменьшение не приведёт к экономии ОЗУ. Ведь буферы остаются. Только переводятся из INDICATOR_DATA в INDICATOR_CALCULATIONS и не более того.

 
Alexey Viktorov:

Заявленное в #property indicator_plots уменьшить можно, это я делал. А вот увеличить вряд-ли получится. Но это уменьшение не приведёт к экономии ОЗУ. Ведь буферы остаются. Только переводятся из INDICATOR_DATA в INDICATOR_CALCULATIONS и не более того.

Спасибо за ответ. Косметическое изменение числа буферов не актуально, к сожалению.

 

В советнике, в блоке OnInit() , хочу получить хендлы стандартного индикатора  MACD с трех таймов - М1 М2 М3.  На график вещаю - работает, но в тестере не работает, при чем терминал виснит наглухо! получается я хочу получить не существующие данные? Подскажите как это побороть?


//+------------------------------------------------------------------+
//|                                                        Test.mq5  |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- Количество периодов торгуемых символов
#define NUMBER_OF_PERIODS 3

ENUM_TIMEFRAMES Periods[NUMBER_OF_PERIODS]={PERIOD_M1,PERIOD_M2,PERIOD_M3};
int handles[NUMBER_OF_PERIODS];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArrayInitialize(handles,INVALID_HANDLE);
      for(int p=0; p<NUMBER_OF_PERIODS; p++)
        {
         if(handles[p]==INVALID_HANDLE)
           {
            handles[p]=iCustom(NULL,Periods[p],"Examples\\MACD");
            Print(handles[p]);
            if(handles[p]==INVALID_HANDLE)  Print("Не удалось получить хэндл индикатора для символа !");
           }
        }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
Причина обращения: