Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1340

 
Así, resulta que el guión
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;
     }
  }
//+------------------------------------------------------------------+

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

Funciona bien. Y la lista de 22 instrumentos. Tarda unos 5 minutos. Sin embargo, es raro. Se pasa la mayor parte del tiempo escribiendo asas en el array. Resultados de los perfiles


Pregunta: ¿Por qué se tarda tanto en copiar 5 valores de una asa a una matriz, mientras que la copia se realiza 132 veces para 22 instrumentos de la lista, es decir, para 273 instrumentos tendría que copiar 1632 veces, y con la carga del historial de todos los instrumentos en el disco duro.

 
Fast235 #:

sobre la creación y eliminación de asas,

funciona, estoy interesado en la forma correcta, espero que los desarrolladores me digan.

Eso es justo lo que estoy haciendo, mira el código de arriba, también hay preguntas))

 
Kira27 #:
Entonces, resultó que el guión

funciona bien. Y la lista de 22 herramientas tarda unos 5 minutos en ser procesada. Sin embargo, esto es raro. Pasa la mayor parte del tiempo escribiendo el mango en el array. Resultado del perfilado


Pregunta: ¿Por qué se tarda tanto en copiar 5 valores de un mango a un array mientras que la copia se realiza 132 veces para 22 herramientas de la lista, es decir, para 273 herramientas necesitaría copiar 1632 veces con la carga del historial para todas las herramientas en mi disco duro.

Si no me equivoco.

Parece que funciona con normalidad, si se han descargado las cotizaciones, no se ralentiza. El primer inicio es muy largo, aparentemente descarga las citas.

//+------------------------------------------------------------------+
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 #:

El objetivo del script es pasar por cada instrumento de Market Watch en los marcos temporales de 1min a 4H

Si tuviera que hacer algo así, crearía un array y almacenaría en él los datos pasados, actualizando los actuales. Esto evitaría los ciclos pesados y el CopyBuffer. Todo volaría.

 
Aleksandr Slavskii #:

Si no me equivoco.

Parece que funciona bien, si se descargan las cotizaciones, no se ralentiza. El primer arranque tarda mucho, supongo que descarga las cotizaciones.

Gracias por tus comentarios y por tu versión del programa, lo probaré)! Sólo me pregunto por qué no borro los manejadores antes de terminar el programa o se borran automáticamente después de terminar el programa, pero la memoria no se libera según el administrador de tareas.

 
Aleksei Stepanenko #:

Si tuviera que hacer algo así, crearía un array y almacenaría en él los datos pasados, actualizando los actuales. Esto evitaría bucles pesados y CopyBuffer. Todo volaría.

Gracias, yo también lo pensaré)

 
Kira27 #:

Gracias por tu comentario y tu versión, ¡experimentaré con ella! No entiendo sólo por qué no se borran los manejadores antes de terminar el programa... O se borran automáticamente al terminar el programa, aunque no se libera la RAM, a juzgar por el administrador de tareas.

He leído en alguna parte que los indicadores se borran automáticamente después de un cierto intervalo de tiempo tras la finalización del script. Pero no es exacto.

 
¡Saludos! ¿Podría usted por favor aconsejar cómo después deprobar un EA en MQL5 a la salida de cualquiera de mis estadísticas en una ventana emergente al pasar el ratón sobre las flechas?
 

Hola

el terminal tiene una herramienta de regresión lineal

hay scripts que dibujan el mismo canal con objetos gráficos

Pero sólo la línea central se dibuja correctamente, las líneas de desviación se dibujan a una distancia incorrecta de la central

aconsejar si alguien sabe la fórmula correcta para calcular la desviación, debe ser como en el terminal

o tal vez hay una solución ya hecha

GRACIAS

 

¡Hola!

Por favor, puede decirme por qué la función OrderSend en criptomoneda no funciona cuando se prueba con el broker AMarkets. No he podido encontrar ninguna prohibición de los asesores de comercio de cripto por la normativa. ¿O tal vez tengo errores en mi código? GetLastError da el error 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);
  }
//+------------------------------------------------------------------+
Razón de la queja: