Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1285

 
Valeriy Yastremskiy:

S'il y a 1440 ordres par jour, il devrait y avoir un contrôle au début de la minute, ou plus simplement à l'apparition de la barre des minutes. Et à ce stade d'ouvrir. Vous ne l'avez pas, donc l'EA ouvre une position à chaque tick, ce qui est une condition stricte en soi, selon la condition de notre symbole à la cotation actuelle. Cette condition peut ne pas être remplie, et les tiques ne seront pas détectées. Et à un moment donné, une erreur critique se produira.

De même, le type d'exécution de l'ordre (ordre d'effectuer une transaction pour créer une position) Tout ou rien.

Je comprends. Merci pour votre aide.

Je pensais aussi qu'il était difficile pour mon EA d'ouvrir autant d'ordres. J'ai essayé de limiter le nombre de commandes avec ce code

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

C'est-à-dire, ouvrir un ordre seulement à 10h00. Mais le résultat est le même.

2020.10.27 10:25:17.548 Core 1 272 Mb de mémoire utilisée dont 36 Mb de données d'historique, 64 Mb de données de tick


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlDateTime time_now;     // Будет использоваться для
   
 TimeCurrent(time_now);  
 if(!SymbolInfoTick(_Symbol,latest_price))
 if(time_now.hour==10&&time_now.min==0)
   {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_RETURN;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

Qu'est-ce que je fais de mal ?

J'ai colorié le code que j'ai ajouté et modifié

Voici ce qu'il est dit dans le fichier journal

FD 0 10:57:05.453 Core 1 processus agent démarré sur 127.0.0.1:3000

CS 0 10:57:05.453 Core 1 se connectant à 127.0.0.1:3000

JD 0 10:57:05.953 Core 1 connecté

OD 0 10:57:05.975 Core 1 autorisé (agent build 2650)

JL 0 10:57:05.980 Testeur EURUSD,M1 (Alpari-MT5-Demo) : test des experts\GRAAL.ex5 du 2020.09.01 00:00 au 2020.09.10 00:00

ON 0 10:57:05.997 Core 1 synchronisation commune terminée

CJ 0 10:57:06.223 Testeur la qualité de l'historique analysé est de 100%.

LM 0 10:57:06.248 Core 1 MetaTester 5 démarré sur 127.0.0.1:3000

EJ 0 10:57:06.248 Core 1 initialisation terminée

LS 0 10:57:06.248 Core 1 login (build 2650)

KO 0 10:57:06.248 Core 1 4372 octets d'infocomptes chargés

LI 0 10:57:06.248 Core 1 1482 octets de paramètres de test chargés

FN 0 10:57:06.248 Core 1 1724 octets de paramètres d'entrée chargés

OK 0 10:57:06.248 Core 1 423 octets de liste de symboles chargés (72 symboles)

HO 0 10:57:06.248 Core 1 fichier expert ajouté : Experts\GRAAL.ex5 13680 octets chargés

CP 0 10:57:06.248 Core 1 4077 Mb disponibles, 50 blocs définis pour la génération de ticks

DI 0 10:57:06.248 Core 1 calculer le profit en pips, dépôt initial 10000, effet de levier 1:100

LP 0 10:57:06.248 Core 1 initialisé avec succès

RI 0 10:57:06.248 Core 1 15 Kb de données d'initialisation totales reçues

DN 0 10:57:06.248 Core 1 Intel Core i5-6400 @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 Core 1 EURUSD : symbole à synchroniser

RS 0 10:57:06.248 Core 1 EURUSD : symbole synchronisé, 3720 octets d'info de symbole reçus

OL 0 10:57:06.248 Core 1 EURUSD : charger 27 octets de données historiques pour synchroniser dans 0:00:00.003

EK 0 10:57:06.248 Core 1 EURUSD : historique synchronisé du 2019.01.02 au 2020.10.23

LK 0 10:57:06.248 Core 1 EURUSD,M1 : cache historique alloué pour 628432 barres et contient 619175 barres de 2019.01.02 06:00 à 2020.08.31 23:59

LH 0 10:57:06.248 Core 1 EURUSD,M1 : l'historique commence à partir de 2019.01.02 06:00

LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo) : génération d'états de barres OHLC. Exécution OnTick au début de la barre seulement

JM 0 10:57:06.248 Core 1 EURUSD,M1 : le test des experts\GRAAL.ex5 du 2020.09.01 00:00 au 2020.09.10 00:00 a commencé avec les entrées:

LS 0 10:57:06.248 Core 1 StopLoss=30

PL 0 10:57:06.248 Core 1 TakeProfit=100

FJ 0 10:57:06.248 Core 1 Lot=0.1

DP 0 10:57:06.248 Core 1 solde final 10000.00 pips

EE 0 10:57:06.248 Core 1 EURUSD,M1 : 39553 ticks, 10068 barres générées. Environnement synchronisé à 0:00:00.031. Test passé en 0:00:00.247 (incluant les ticks de prétraitement 0:00:00.016).

DE 0 10:57:06.248 Core 1 EURUSD,M1 : temps total de la connexion à l'arrêt du test 0:00:00.278 (dont 0:00:00.031 pour la synchronisation des données historiques)

NQ 0 10:57:06.248 Core 1 272 Mo de mémoire utilisée dont 36 Mo de données historiques, 64 Mo de données tick.

KE 0 10:57:06.248 Core 1 fichier journal "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" écrit

OS 0 10:57:06.260 Core 1 connexion fermée


 
Denis Diakonov:

Pouvez-vous me le dire s'il vous plaît !

Pourquoi l'heure du serveur n'est-elle pas mise à jour lorsque de nouveaux ticks arrivent ?

Au moment où l'EA démarre, tout fonctionne comme il se doit, mais ensuite le temps passe, mais la nouvelle valeur de la minute en cours n'entre pas dans la variable.

C'est-à-dire que le Conseiller Expert fonctionne en fonction du nombre obtenu dans la variable int M = TimeMinute(TimeCurrent()) ;

En fait, cette ligne de code provient de la référence et elle ne fonctionne pas.

Par exemple, je le démarre à 12-l'heureactuelle renvoyée par le serveur correspond à l'heure dans la variable, mais ensuite la variable reste à 12, bien qu'il soit déjà 15-20 minutes à l'horloge

Le code est complètement meilleur, plus précisément où vous créez la fonction et dans quelle fonction (OnInit, OnTick, OnTime) récupérer la valeur des minutes et appeler la fonction print. Si dans OnInit ou en dehors des champs de fonction du terminal, c'est comme ça que ça doit être. Si elle est dans OnTick, elle imprimera à chaque tick et mettra à jour la valeur avec une nouvelle minute.

 

Exemple clair de temps de serveur et de valeur variable

Valeriy Yastremskiy:

Le code est complètement meilleur, plus précisément où vous créez la fonction et dans quelle fonction (OnInit, OnTick, OnTime) vous récupérez la valeur des minutes et appelez la fonction print. Si dans OnInit ou en dehors des champs de fonction du terminal, c'est comme ça que ça doit être. Si elle est dans OnTick, elle imprimera à chaque tick et mettra à jour la valeur avec une nouvelle minute.

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

Eh bien, voici le code complet. Dans la fonction void OnTick(), elle est déclenchée au tout début par la première ligne à exécuter.

Il n'est déclenché qu'au moment de la recompilation ou de l'ajout au calendrier/champ de suppression/. Pour le reste du temps, la variable M contient la valeur de la minute obtenue lors de la première exécution de l'EA.

 
Denis Diakonov:

Eh bien, le code ici est tout ce qu'il y a à faire. Le void OnTick() est déclenché au tout début par la première ligne à exécuter.

Elle n'est déclenchée qu'au moment de la recompilation ou de la jonction au graphe/champ de suppression/ . Pour le reste du temps, la variable M contient la valeur de la minute obtenue lors de la première exécution de l'EA.

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

Je l'ai, merci !

J'aurais dû

int M = TimeMinute(TimeCurrent());

le mettre dans le corps de la fonction, au lieu d'assigner la valeur M avant elle

 
Denis Diakonov:

Je l'ai, merci !

J'aurais dû

le mettre dans le corps de la fonction, au lieu d'assigner la valeur M avant.

Vous pouvez le faire de différentes manières. Lire les variables globales et locales et leur visibilité.

 

Après-midi. J'essaie d'obtenir l'angle de la ligne de tendance à partir de l'angle. Voici le code :

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

L'angle est toujours égal à 0. Qu'il s'agisse d'utiliser des méthodes de la bibliothèque standard ou des fonctions intégrées. En même temps, la ligne est tracée. Qu'est-ce qui ne va pas ? Comment obtenir l'angle ?

 
leonerd:

Après-midi. J'essaie d'obtenir l'angle de la ligne de tendance à partir de l'angle. Voici le code :

L'angle est toujours égal à 0. Qu'il s'agisse d'utiliser des méthodes de la bibliothèque standard ou des fonctions intégrées. En même temps, la ligne est tracée. Qu'est-ce qui ne va pas ? Comment obtenir l'angle ?

https://www.mql5.com/ru/forum/103591

Je vois, mais comment calculez-vous l'angle ?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

Je vois, mais comment calculez-vous l'angle ?

Vous êtes un comédien.

De qui je me moque ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes les questions des débutants sur MQL4 et MQL5, toute aide et discussion sur les algorithmes et les codes.

Nikolai Semko, 2020.10.26 00:34

Vous ne devez pas avoir peur de la vitesse. C'est juste une conditionnalité pour la conversion de type.
Comme une variante de la fonction de définition des angles :

struct PointPriceTime
  {
   double            price;
   datetime          time;
                     PointPriceTime(double p, datetime t) { price=p; time=t; };
   void              Set(double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price=0.0; time=0; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   int i=0;
   while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
      i++;
   if(i==9)
     {
      Print("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

Après MT5, la sensation de MT4 est tout simplement affreuse. L'accès à l'histoire est en quelque sorte émasculé. Je ne parle même pas des tiques.




 

Pouvez-vous me dire si cette sélection de polices est possible dans l'indicateur ?


Raison: