Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1340

 
Così, si scopre che lo script
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;
     }
  }
//+------------------------------------------------------------------+

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

Funziona bene, e la lista dei 22 strumenti. Ci mette circa 5 minuti, ma è strano: passa la maggior parte del tempo a scrivere gli handle nell'array. Risultati del profiling


Domanda: perché ci vuole così tanto tempo per copiare 5 valori da un handle a un array, anche se viene copiato 132 volte per 22 strumenti della lista, cioè per 273 strumenti avrei bisogno di copiare 1632 volte, e con il caricamento della cronologia per tutti gli strumenti sul disco rigido.

 
Fast235 #:

sulla creazione e l'eliminazione di maniglie,

funziona, sono interessato al modo giusto, spero che gli sviluppatori me lo dicano.

È proprio quello che sto facendo, guarda il codice sopra, ci sono anche delle domande))

 
Kira27 #:
Così, si è scoperto che la sceneggiatura

funziona bene. E la lista dei 22 strumenti impiega circa 5 minuti per essere elaborata. Questo è strano, però. Passa la maggior parte del tempo a scrivere l'handle nell'array. Risultato del profiling


Domanda: perché ci vuole così tanto tempo per copiare 5 valori da un handle a un array, mentre la copia viene eseguita 132 volte per 22 strumenti della lista, cioè per 273 strumenti avrei bisogno di copiare 1632 volte, inoltre, con il caricamento della cronologia per tutti gli strumenti sul mio disco rigido.

Se non mi sbaglio.

Sembra funzionare normalmente, se le citazioni sono state scaricate, non rallenta. Il primo avvio è molto lungo, apparentemente scarica le citazioni.

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

Il punto dello script è di passare attraverso ogni strumento da Market Watch su timeframe da 1min a 4H

Se dovessi fare una cosa del genere, creerei un array e ci memorizzerei i dati passati, aggiornando i dati attuali. Questo eviterebbe cicli pesanti e CopyBuffer. Tutto volerebbe.

 
Aleksandr Slavskii #:

Se non mi sbaglio.

Sembra funzionare bene, se le citazioni vengono scaricate, non rallenta. Il primo avvio richiede un tempo molto lungo, credo che scarichi le citazioni.

Grazie per il tuo feedback e la tua versione del programma, la proverò)! Mi chiedo solo perché non cancelli le maniglie prima di finire il programma o saranno cancellate automaticamente dopo che il programma è finito, ma la memoria non viene liberata secondo il task manager.

 
Aleksei Stepanenko #:

Se dovessi fare una cosa del genere, creerei un array e ci memorizzerei i dati passati, aggiornando i dati attuali. Questo eviterebbe loop pesanti e CopyBuffer. Tutto volerebbe.

Grazie, ci penserò anche io)

 
Kira27 #:

Grazie per il tuo feedback e la tua versione, la sperimenterò)! Non capisco solo perché non si cancellano le maniglie prima di terminare il programma? Oppure vengono cancellate automaticamente alla fine del programma, anche se la RAM non viene liberata, a giudicare dal task manager.

Ho letto da qualche parte che le maniglie degli indicatori vengono automaticamente cancellate dopo un certo intervallo di tempo dopo la fine dello script. Ma non è esatto.

 
Saluti! Potreste per favore consigliarmi come, dopo avertestato un EA in MQL5, far uscire una qualsiasi delle mie statistiche in una finestra popup quando si passa il mouse sopra le frecce?
 

Ciao

il terminale ha uno strumento di regressione lineare

ci sono script che disegnano lo stesso canale con oggetti grafici

Ma solo la linea centrale è disegnata correttamente, le linee di deviazione sono disegnate ad una distanza errata da quella centrale

consigliare se qualcuno conosce la formula corretta per calcolare la deviazione, dovrebbe essere come nel terminale

o forse c'è una soluzione già pronta

GRAZIE

 

Ciao!

Potete dirmi perché la funzione OrderSend sulle criptovalute non funziona durante i test con il broker AMarkets. Non ho trovato alcun divieto di trading sulle criptovalute da parte del regolamento. O forse ho degli errori nel mio codice? GetLastError dà l'errore 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);
  }
//+------------------------------------------------------------------+
Motivazione: