Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1340

 
Es stellt sich also heraus, dass das Skript
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;
     }
  }
//+------------------------------------------------------------------+

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

Und die Liste der 22 Instrumente funktioniert einwandfrei. Es dauert etwa 5 Minuten. Es ist allerdings seltsam. Es verbringt die meiste Zeit damit, Handles in das Array zu schreiben. Profiling-Ergebnisse


Frage: Warum ist es so zeitaufwendig, 5 Werte von einem Handle in ein Array zu kopieren, während das Kopieren 132 Mal für 22 Instrumente in der Liste erfolgt, d.h. für 273 Instrumente müsste ich 1632 Mal kopieren, und das mit dem Laden der Historie für alle Instrumente auf der Festplatte.

 
Fast235 #:

über die Erstellung und Löschung von Handles,

es funktioniert, bin ich in den richtigen Weg interessiert, ich hoffe, die Entwickler werden mir sagen.

Das ist genau das, was ich tue, sehen Sie sich den Code oben, es gibt auch Fragen))

 
Kira27 #:
Es stellte sich also heraus, dass das Drehbuch

funktioniert einwandfrei, und die Abarbeitung der Liste von 22 Werkzeugen dauert etwa 5 Minuten. Die meiste Zeit verbringt das Programm jedoch mit dem Schreiben des Handles in das Array. Profiling-Ergebnis


Frage: Warum ist es so zeitaufwendig, 5 Werte von einem Handle in ein Array zu kopieren, während das Kopieren für 22 Werkzeuge aus der Liste 132 Mal durchgeführt wird, d.h. 273 Werkzeuge müssten 1632 Mal kopiert werden, noch dazu mit History Loading für alle Werkzeuge auf meiner Festplatte.

Wenn ich mich nicht täusche.

Es scheint normal zu funktionieren, wenn die Angebote heruntergeladen wurden, wird es nicht langsamer. Der erste Start ist sehr lang, offenbar lädt er die Zitate herunter.

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

Der Zweck des Skripts ist es, jedes Instrument von Market Watch auf Zeitrahmen von 1min bis 4H durchzugehen

Wenn ich so etwas machen würde, würde ich ein Array erstellen und vergangene Daten darin speichern und die aktuellen Daten aktualisieren. Dies würde schwere Zyklen und CopyBuffer vermeiden. Alles würde fliegen.

 
Aleksandr Slavskii #:

Wenn ich mich nicht täusche.

Es scheint gut zu funktionieren, wenn die Angebote heruntergeladen werden, wird es nicht langsamer. Der erste Start dauert sehr lange, ich vermute, er lädt die Zitate herunter.

Ich frage mich nur, warum ich die Handles nicht lösche, bevor ich das Programm beende, oder ob sie automatisch gelöscht werden, nachdem das Programm beendet ist, aber der Speicher wird laut Taskmanager nicht freigegeben.

 
Aleksei Stepanenko #:

Wenn ich so etwas machen würde, würde ich ein Array erstellen und vergangene Daten darin speichern und die aktuellen Daten aktualisieren. Dies würde schwere Schleifen und CopyBuffer vermeiden. Alles würde fliegen.

Danke, ich werde auch darüber nachdenken)

 
Kira27 #:

Danke für Ihr Feedback und Ihre Version, ich werde damit experimentieren)! Ich verstehe nur nicht, warum Sie die Handles nicht löschen, bevor Sie das Programm beenden? Oder werden sie am Ende des Programms automatisch gelöscht, obwohl der Arbeitsspeicher nicht freigegeben wird, dem Taskmanager nach zu urteilen.

Ich habe irgendwo gelesen, dass Indikator-Handles nach einer gewissen Zeitspanne nach Beendigung des Skripts automatisch gelöscht werden. Aber es ist nicht genau.

 
Grüße! Könnten Sie bitte beraten, wie nach demTesten eines EA in MQL5 zur Ausgabe einer meiner Statistiken in einem Popup-Fenster, wenn die Maus über die Pfeile schwebt?
 

Hallo

das Terminal verfügt über ein Werkzeug zur linearen Regression

es gibt Skripte, die denselben Kanal mit grafischen Objekten zeichnen

Aber nur die Mittellinie wird richtig gezeichnet, die Abweichungslinien werden in einem falschen Abstand von der Mittellinie gezeichnet

Wenn Sie die richtige Formel für die Berechnung der Abweichung kennen, sollte sie wie im Terminal aussehen

oder vielleicht gibt es eine fertige Lösung

DANKESCHÖN

 

Hallo!

Können Sie mir bitte sagen, warum die OrderSend-Funktion für Kryptowährungen beim Testen mit AMarkets Broker nicht funktioniert. Ich konnte in den Vorschriften kein Verbot des Handels mit Kryptowährungen finden. Oder habe ich vielleicht Fehler in meinem Code? GetLastError gibt Fehler 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);
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: