Questions des débutants MQL5 MT5 MetaTrader 5 - page 1340

 
Donc, il s'avère que le 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;
     }
  }
//+------------------------------------------------------------------+

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

Cela fonctionne bien. Et la liste de 22 instruments. Cela prend environ 5 minutes. C'est bizarre, cependant. Il passe la plupart de son temps à écrire des handles dans le tableau. Résultats du profilage


Question : Pourquoi est-ce si long de copier 5 valeurs d'un handle vers un tableau, bien qu'elles soient copiées 132 fois pour 22 instruments de la liste, c'est-à-dire que pour 273 instruments, il me faudrait copier 1632 fois, et avec un historique de chargement pour tous les instruments du disque dur.

 
Fast235 #:

sur la création et la suppression de poignées,

ça marche, je suis intéressé par le bon chemin, j'espère que les développeurs me le diront.

C'est exactement ce que je fais, regardez le code ci-dessus, il y a aussi des questions))

 
Kira27 #:
Donc, il s'est avéré que le script

fonctionne bien. Et la liste des 22 outils prend environ 5 minutes à traiter. C'est bizarre, cependant. Il passe la plupart de son temps à écrire le handle dans le tableau. Résultat du profilage


Question : Pourquoi est-ce si long de copier 5 valeurs d'un handle vers un tableau alors que la copie est effectuée 132 fois pour 22 outils de la liste, c'est-à-dire que pour 273 outils il faudrait copier 1632 fois, de plus avec le chargement de l'historique pour tous les outils sur mon disque dur.

Si je ne me trompe pas.

Il semble fonctionner normalement, si les citations ont été téléchargées, il ne ralentit pas. Le premier démarrage est très long, apparemment il télécharge les guillemets.

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

Le but de ce script est de passer en revue chaque instrument de Market Watch sur des échelles de temps allant de 1min à 4H.

Si je devais faire une telle chose, je créerais un tableau et y stockerais les données passées, en mettant à jour les données actuelles. Cela permettrait d'éviter les cycles lourds et CopyBuffer. Tout s'envolerait.

 
Aleksandr Slavskii #:

Si je ne me trompe pas.

Il semble fonctionner correctement, si les devis sont téléchargés, il ne ralentit pas. Le premier démarrage prend beaucoup de temps, je suppose que ça télécharge les devis.

Merci pour vos commentaires et votre version du programme, je vais l'essayer) ! Je me demande seulement pourquoi je ne supprime pas les poignées avant de terminer le programme ou elles seront supprimées automatiquement après la fin du programme, mais la mémoire n'est pas libérée selon le gestionnaire de tâches.

 
Aleksei Stepanenko #:

Si je devais faire une telle chose, je créerais un tableau et y stockerais les données passées, en mettant à jour les données actuelles. Cela permettrait d'éviter les boucles lourdes et le CopyBuffer. Tout s'envolerait.

Merci, je vais y penser aussi)

 
Kira27 #:

Merci pour vos commentaires et votre version, je vais l'expérimenter) ! Je ne comprends pas seulement pourquoi vous ne supprimez pas les handles avant de terminer le programme ? Ou bien ils sont automatiquement supprimés à la fin du programme, bien que la RAM ne soit pas libérée, à en juger par le gestionnaire de tâches.

J'ai lu quelque part que les handles des indicateurs sont automatiquement supprimés après un certain intervalle de temps après la fin du script. Mais ce n'est pas exact.

 
Salutations ! Pourriez-vous m'indiquer comment, après avoirtesté un EA dans MQL5, afficher n'importe laquelle de mes statistiques dans une fenêtre popup lorsque la souris passe sur les flèches ?
 

Bonjour

le terminal dispose d'un outil de régression linéaire

il existe des scripts qui dessinent le même canal avec des objets graphiques

Mais seule la ligne centrale est dessinée correctement, les lignes de déviation sont dessinées à une distance incorrecte de la ligne centrale.

conseiller si quelqu'un connaît la formule correcte pour calculer l'écart, il devrait être comme dans le terminal

ou peut-être existe-t-il une solution toute faite

MERCI

 

Bonjour !

Pouvez-vous me dire pourquoi la fonction OrderSend sur les crypto-monnaies ne fonctionne pas lors du test avec le courtier AMarkets. Je n'ai pas trouvé d'interdiction d'échanger des crypto-monnaies par la réglementation. Ou peut-être ai-je des erreurs dans mon code ? GetLastError donne l'erreur 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);
  }
//+------------------------------------------------------------------+