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

 
Итак, оказалось что скрипт
void OnStart()
  {
   int Target=6;       //Количество тайм-фреймов
   int Counter_UP=0;   //Счетчик нахождения цены над МА
   int Counter_DOWN=0;
   int MA = 200;       //Период МА
   double bufer_MA[];  //Буфер для хендла
   ENUM_TIMEFRAMES frame1[10];  //Битная маска тайм-фреймов
//___________________int битная маска ENUM  Массив таймфреймов__________________________________________
   frame1[1]=1;
   frame1[2]=5;
   frame1[3]=15;
   frame1[4]=30;
   frame1[5]=16385;
   frame1[6]=16388;
   frame1[7]=16408;
   frame1[8]=32769;
   frame1[9]=49153;
//____________________________________________________________________________________________________________

   int KollSymbols = SymbolsTotal(true);  //Колл. символов в маркет вотч
   Alert("Колл.Инстр = ",KollSymbols);
//---
   int MA200;  //Переменная для хендла
   for(int i=0; i<KollSymbols; i++) //Перебераем все символы из маркет вотч
     {
      string symbol = SymbolName(i,true);  //Выбираем имя символа из маркет вотч
     // Alert("symbol = ",symbol,"i= ",i);
      for(int I=1; I<=Target; I++)  //Перебераем таймфреймы
        {
         MA200 = iMA(symbol,frame1[I],MA,0,MODE_EMA,PRICE_MEDIAN);  //хендл на выбранном тайме
         CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

         ArraySetAsSeries(bufer_MA,true);  //Разворачиваем массив как в тайм-серии

         //Alert("Символ - ",symbol,"i= ",i);
         // Alert("Simbol = ",symbol," bufer_MA[1] = ",bufer_MA[1]);
         if(iClose(symbol,frame1[I],1) > bufer_MA[1])  //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре
           {
            //Alert("iClose= ",iClose(symbol,frame1[I],1), " bufer_MA[1]= ",bufer_MA[1]);
            Counter_UP++;
            if(Counter_UP==Target)
               Alert("Инструмент для наблюдения в покупки - ",symbol);

            ArrayFree(bufer_MA);      //Очистка буфера индикатора
         
           }
         else
           {
            ArrayFree(bufer_MA);      //Очистка буфера индикатора
           }
         IndicatorRelease(MA200); //Удаление хендла
        }
      Counter_UP=0;
      Counter_DOWN=0;
     }
  }
//+------------------------------------------------------------------+

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

работает норм.   И список из 22 инстр.   обрабатывает достаточно долго мин 5.  Хотя это странно.   Основное время он тратит на запись хендла в массив.  Итог профилирования  


Вопрос.  Почему так затратно по времени копирование 5 значений из хендла в массив, хотя копирование происходит 132 раза для 22инструментов из списка.  То-есть для 273 инструментов понадобится копировать 1632 раза, причём с подгрузкой истории по всем инструментам на хард компа. 

 
Fast235 #:

про создание и удаление хендлов,

это работает, интересует как будет правильней, надеюсь разработчики скажут

Вот я как раз этим занимаюсь, в коде выше посмотрите, тоже есть вопросы))

 
Kira27 #:
Итак, оказалось что скрипт

работает норм.   И список из 22 инстр.   обрабатывает достаточно долго мин 5.  Хотя это странно.   Основное время он тратит на запись хендла в массив.  Итог профилирования  


Вопрос.  Почему так затратно по времени копирование 5 значений из хендла в массив, хотя копирование происходит 132 раза для 22инструментов из списка.  То-есть для 273 инструментов понадобится копировать 1632 раза, причём с подгрузкой истории по всем инструментам на хард компа. 

Если ничего не напутал.

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

//+------------------------------------------------------------------+
void OnStart()
  {
   int Target = 6;     //Количество тайм-фреймов
   int Counter_UP = 0; //Счетчик нахождения цены над МА
   int Counter_DOWN = 0;
   int MA = 200;       //Период МА
   double bufer_MA[];  //Буфер для хендла
   int MA200[][9];  //Переменная для хендла
   string symbol[];

   ENUM_TIMEFRAMES frame1[9];  //Битная маска тайм-фреймов
//___________________int битная маска ENUM  Массив таймфреймов__________________________________________
   frame1[0] = 1;
   frame1[1] = 5;
   frame1[2] = 15;
   frame1[3] = 30;
   frame1[4] = 16385;
   frame1[5] = 16388;
   frame1[6] = 16408;
   frame1[7] = 32769;
   frame1[8] = 49153;
//____________________________________________________________________________________________________________

   int KollSymbols = SymbolsTotal(true);  //Колл. символов в маркет вотч
   Print("Колл.Инстр = ", KollSymbols);
   int res = 0;
   for(int i = 0; i < KollSymbols; i++)
     {
      for(int I = 0; I < 9; I++) //Перебераем таймфреймы
        {
         ArrayResize(MA200, i + 1);
         ArrayResize(symbol, i + 1);
         symbol[i] = SymbolName(i, true); //Выбираем имя символа из маркет вотч
         MA200[i][I] = iMA(symbol[i], frame1[I], MA, 0, MODE_EMA, PRICE_MEDIAN); //хендл на выбранном тайме
         if(MA200[i][I] == INVALID_HANDLE)
            PrintFormat("Инвалид хэндл, символ %s, тайм %d", symbol[i], frame1[I]);
         res++;
        }
     }
   Print("Создано хэндлов = " + (string)res);

//---
   for(int i = 0; i < KollSymbols; i++)
     {
      for(int I = 0; I < 9; I++) //Перебераем таймфреймы
        {
         int size = CopyBuffer(MA200[i][I], 0, 1, 1, bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма
         PrintFormat("Скопировано %d, символ %s, тайм %d", size, symbol[i], frame1[I]);
         if(size > 0)
            if(iClose(symbol[i], frame1[I], 1) > bufer_MA[0]) //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре
              {
               Counter_UP++;
              }
        }
     }
   Print("Counter_UP = " + (string)Counter_UP);
  }
//+------------------------------------------------------------------+
 
Kira27 #:

Смысл скрипта, перебрать каждый инструмент из маркет вотч на таймфреймах с 1мин до 4Н

Если бы я делал такое, то создал бы массив и хранил в нём прошлые данные, обновляя текущие. Это позволит избежать тяжёлые циклы и CopyBuffer. Всё будет летать.

 
Aleksandr Slavskii #:

Если ничего не напутал.

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

Спасибо за отклик, и ваш вариант исполнения, поэксперементирую с ним)!  Не понял только почему перед завершением программы не удаляете хендлы?  Или они при завершении проги сами автоматом удаляются.  Хотя оператива не освобождается судя по диспетчеру задач.

 
Aleksei Stepanenko #:

Если бы я делал такое, то создал бы массив и хранил в нём прошлые данные, обновляя текущие. Это позволит избежать тяжёлые циклы и CopyBuffer. Всё будет летать.

Спасибо!  Подумаю и в этом направлении)

 
Kira27 #:

Спасибо за отклик, и ваш вариант исполнения, поэксперементирую с ним)!  Не понял только почему перед завершением программы не удаляете хендлы?  Или они при завершении проги сами автоматом удаляются.  Хотя оператива не освобождается судя по диспетчеру задач.

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

 
Доброго! Подскажите пожалуйста, как после тестирования советника в MQL5 выводить в сплывающем окне при наведении мыши на стрелочках любую свою статистику? 
 

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

в терминале есть инструмент линейная регрессия

есть скрипты которые рисуют такой же канал графическими обектами

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

подскажите если кто знает правильную формулу расчета отклонения чтоб было как в терминале

или может есть у кого готовое решение

СПАСИБО

 

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

Подскажите пожалуйста, почему не работает функция OrderSend на криптовалюте при тестировании у брокера AMarkets. По регламентам не нашел запрещения торговли советниками на крипте. Или у меня возможно ошибки в коде?  GetLastError выдает ошибку 4756

#property copyright "qwerty"
#property link      "qwerty@list.ru"
#property version   "1.00"
//-----------------
//-----------------
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
//-----------------
//-----------------
CPositionInfo  aPosition;
CTrade         aTrade;
CSymbolInfo    aSymbol;
CAccountInfo   aAccount;
//-----------------
//-----------------

int      Slippage      = 3000;
//---
//---------------------------------
//------пробные переменные
double LotsCrypto = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!aSymbol.Name(Symbol()))
      return(INIT_FAILED);
   RefreshRates();
//---устанавливаем допустимое проскальзывание
   aTrade.SetDeviationInPoints(Slippage);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  RefreshRates();
   LotsCrypto = 0.1;
   if(OpenSellPosition(aSymbol.Name(), LotsCrypto, NULL, Slippage, ORDER_FILLING_RETURN))
      Print("Ура");  
   Comment("Symbol.Name = " + string(aSymbol.Name()) + "\n" +
           "Ask = " +  string(aSymbol.Ask()) + "\n"+
           "GetLastError = " +  string(GetLastError()) + "\n"+
           "LotsCrypto = " +  string(LotsCrypto));

}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+ Обновление котировок                                             +
//+------------------------------------------------------------------+
bool RefreshRates()
  {
   if(!aSymbol.RefreshRates())
     {
      Print("Не удалось обновить котировки валютной пары!");
      return(false);
     }
   if(aSymbol.Ask() == 0 || aSymbol.Bid() == 0)
      return(false);
   return(true);
  }

//+------------------------------------------------------------------+
bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=1000, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
  {
   MqlTradeRequest Request;
   MqlTradeResult Results;
   ZeroMemory(Request);
   ZeroMemory(Results);
   Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   Request.action=TRADE_ACTION_DEAL;
   Request.type=ORDER_TYPE_SELL;
   Request.symbol=symbol;
   Request.volume=volume;
   Request.deviation=deviation;
   Request.comment=comment;
   Request.type_filling=filling;
   bool res=false;
   res=OrderSend(Request,Results);
   if(res)
     {
      if(Results.deal>0)
         return(true);
      else
         return(false);
     }
   return(false);
  }
//+------------------------------------------------------------------+