Questions des débutants MQL4 MT4 MetaTrader 4 - page 90

 
toni_starkle conseiller expert fonctionnait il y a 1,5 an, maintenant il n'apparaît pas sur le graphique.

la thèse : mouvement=vie, repos=mort. Qu'est-ce que ça dit dans le journal ? C'est en bas à droite, deux onglets.

si j'en avais un - je le vérifierais et le réparerais ...

 

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

Questions des débutants MQL4 MT4 MetaTrader 4

Ilya Prozumentov, 2017.06.11 13:53

Il existe un modèle de classe pour travailler avec un tableau.
#property strict
#include <ObjectVariables.mqh>
#include <Arrays\varQSort.mqh>
#include <Arrays\objQSort.mqh>

template<typename T1>
class ArrayList
{
   private:
      T1 array[];
      QuickSorts<T1> *qs;
      int size;
      int index;

   public:
      //прочие функции
      void QuickSort();//отсортировать массив
      //прочие функции
};
//+------------------------------------------------------------------+
//| Сортировка массива
template<typename T1>
void ArrayList::QuickSort()
{
   int idx = index;//сохранение положения индекса
   if(IsPointer(array[0])) // true - массив содержит указатели класса
      qs /*ошибка 2*/ = new ObjQSort<T1>();
   else
      qs /*ошибка 2*/ = new VarQSort<T1>();
   qs.Sort(array, 0, index);
   index = idx;
}

Pour cette classe modèle, nous devons implémenter le tri, étant donné que le tableau peut stocker des types de données complexes. Par exemple :
ArrayList<PP*> *dde; // PP - класс

Je peux écrire des fonctions différentes pour les types simples et complexes, mais le compilateur ne comprend pas que les fonctions sont rigidement délimitées par le type de données et continue à jurer :
'<' - opération illégale utiliser ArrayList.mqh

J'ai donc décidé d'intégrer l'interface :

#property strict
template <typename T1>
interface QuickSorts
{
   void Sort(T1 &array[], int beg, int end);
};
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class VarQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end);
   VarQSort(){}
   ~VarQSort(){}
};
template <typename T1>
void VarQSort::Sort(T1 &array[], int beg,int end)
{
   //алгоритм функции
}
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class ObjQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end){}
   ObjQSort(){}
   ~ObjQSort(){}
};

Toutes les parties de la construction se compilent. Mais si vous essayez de le déclarer :
ArrayList<PP*> *dde; // PP - класс
puis, lors de la compilation du fichier, voici les erreurs :

QuickSorts' - incompatibilité de modèle varQSort.mqh /*erreur 1*/
'=' - incompatibilité de type ArrayList.mqh /*erreur 2*/


Que dois-je corriger dans le code pour éliminer cette incompatibilité de type ? Je ne comprends pas pourquoi cela s'est produit en premier lieu.

P.S.
'<' - opération illégale utiliser varQSort.mqh
me hante aussi dans cette construction. C'est justement cette erreur dont je voulais me débarrasser. Mais je comprends cette erreur, et je ne comprends pas ces deux-là.
template <typename T1>
class VarQSort : public QuickSorts<T1>
//....

template <typename T1>
class ObjQSort : public QuickSorts<T1>
//....
 
fxsaber:
En effet) L'erreur de divergence a disparu et l'autre avec elle. Merci.
 
Salutations chers membres du forum, j'ai besoin d'aide pour ajouter quelques modifications à la fonction.
enum _EventYesNo{
      YES            = 1,           //ДА
      NO             = 2            //НЕТ
      };
enum howmuch {one = 1,              //Одна
              two = 2,              //Две
              three = 3             //Три
              };

input    _EventYesNo    monday                     = 2;                 //торгуем в ПОНЕДЕЛЬНИК?
input    howmuch        mondayHM                   = 1;                 //Сколько сделок?
input    string         monday_open1               = "00:00";           //
input    string         monday_open2               = "00:00";           //
input    string         monday_open3               = "00:00";           //

input    _EventYesNo    tuesday                    = 2;                 //торгуем во ВТОРНИК?
input    howmuch        tuesdayHM                  = 1;                 //Сколько сделок?
input    string         tuesday_open1              = "00:00";           //
input    string         tuesday_open2              = "00:00";           //
input    string         tuesday_open3              = "00:00";           //

input    _EventYesNo    wednesday                  = 2;                 //торгуем в СРЕДУ?
input    howmuch        wednesdayHM                = 1;                 //Сколько сделок?
input    string         wednesday_open1            = "00:00";           //
input    string         wednesday_open2            = "00:00";           //
input    string         wednesday_open3            = "00:00";           //

input    _EventYesNo    thursday                   = 2;                 //торгуем в ЧЕТВЕРГ?
input    howmuch        thursdayHM                 = 1;                 //Сколько сделок?
input    string         thursday_open1             = "00:00";           //
input    string         thursday_open2             = "00:00";           //
input    string         thursday_open3             = "00:00";           //

input    _EventYesNo    friday                     = 2;                 //торгуем в ПЯТНИЦУ?
input    howmuch        fridayHM                   = 1;                 //Сколько сделок?
input    string         friday_open1               = "00:00";           //
input    string         friday_open2               = "00:00";           //
input    string         friday_open3               = "00:00";           //

extern int         minutes = 5;          // Время торговли(минут) bool    HOUR = true;                     // Часы Вкл (true) / Выкл (folse) //Отправляет true если по времени разрешено торговать bool isTradeTimeString() { datetime servertime = TimeCurrent(); datetime localtime = TimeLocal(); datetime time = 0; datetime hbegin = 0; datetime hend = 0; string TimeBegin = "00:00"; if(DayOfWeek() == 1){if(monday == 1){TimeBegin = monday_open1;}else{return(false);}} if(DayOfWeek() == 2){if(tuesday == 1){TimeBegin = tuesday_open1;}else{return(false);}} if(DayOfWeek() == 3){if(wednesday == 1){TimeBegin = wednesday_open1;}else{return(false);}} if(DayOfWeek() == 4){if(thursday == 1){TimeBegin = thursday_open1;}else{return(false);}} if(DayOfWeek() == 5){if(friday == 1){TimeBegin = friday_open1;}else{return(false);}} string TimeEnd = TimeToString(StrToTime(TimeBegin)+(60*minutes),TIME_MINUTES); if(servertime > localtime) {   time = servertime - localtime;   hbegin = StrToTime(TimeBegin) + time;   hend = StrToTime(TimeEnd) + time; } if(servertime < localtime) {   time = localtime - servertime;   hbegin = StrToTime(TimeBegin) - time;   hend = StrToTime(TimeEnd) - time; } if(localtime == servertime) {   hbegin = StrToTime(TimeBegin);   hend = StrToTime(TimeEnd); } datetime dtBegin, dtEnd;        // Время начала и окончания работы int      hc, he;                // Часы текущего времени и окончания работы dtBegin=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hbegin,TIME_MINUTES)); dtEnd=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hend,TIME_MINUTES)); hc = TimeHour(TimeCurrent()); he = TimeHour(dtEnd); if(dtBegin>=dtEnd) {   if(hc>=he)    dtEnd+=24*60*60;   else    dtBegin-=24*60*60; } if(HOUR==true) {   if(TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd)    return(true);   else   {    if(CountTrades()==0)     return(false);   } } return(true); }

J'ai besoin, par exemple le lundi, si je dois ouvrir 2 ou 3 transactions, la fonction compare le temps et envoie le tuyau, mais j'ai un temps comparé jusqu'à présent.


	          
 
L'exportation des devis vous permettra de choisir la date à laquelle vous souhaitez les télécharger.

En effet, lorsque vous appuyez sur le bouton "Télécharger", 6 000 000 de citations seront téléchargées. Tout le monde n'a pas envie de remplir le disque dur de données de citations, d'attendre longtemps qu'elles soient téléchargées, puis de supprimer les données inutiles de la table des citations.

 

Bonjour, ma chère... Pouvez-vous me dire pourquoi le code de trailing stop spécifié pour les ordres BUY fonctionne correctement ...

       if (OrderType()==OP_BUY && (Bid-8*D*Point)>OrderStopLoss()&&(Bid-8*D*Point)>OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Bid-7*Point,Digits),NormalizeDouble(OrderOpenPrice()+25*D*Point,Digits),0,0);}

... ... mais le même pour les ordres de VENTE ne fixe pas de SL...

       if (OrderType()==OP_SELL &&(Ask+8*D*Point)<OrderStopLoss()&&(Ask+8*D*Point)<OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+7*Point,Digits),NormalizeDouble(OrderOpenPrice()-25*D*Point,Digits),0,0);}

... La raison est probablement dans la condition(Ask+8*D*Point)<OrderStopLoss(), si nous la supprimons, SL sera mis, mais Trailing Stop fonctionne incorrectement sans la condition spécifiée ...

Pour les ordres d'achat , lacondition(Bid-8*D*Point)>OrderStopLoss(), siOrderStopLoss()==0, est acceptéecorrectement (i.e. une certaine valeur > 0) ...

... Maisla condition(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 n'est pascorrecte (i.e. une certainevaleur est< 0

) ...

Veuillez m'indiquer comment formuler correctement dans le code la condition requise(Ask+8*D*Point)<OrderStopLoss()pour un fonctionnement correct duTrailing Stop avec les ordresSELL.

Je remercie d'avance tous ceux qui ont répondu

.
 

Bonjour : Il existe une fonction où l'indicateur lit le fichier d'historique des tics. Mais il n'est lu qu'une seule fois, lorsque l'indicateur est chargé ou mis à jour. Comment puis-je faire en sorte qu'il soit lu à chaque fois que le premier tick de la barre zéro apparaît ?

void ProcessOldCandles(int limit, TickStruct &lastTick)

{

      int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);

   if (hTicksFile < 1)

      return;

      TickStruct tick;

   while (!IsStopped())

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

      if (tick.time >= Time[limit])

         break;

   }

   lastTick = tick;

   int barIndex = iBarShift(NULL, 0, tick.time);

      while (barIndex >= 0)

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

         if (!IsTickBelongToBar(tick, barIndex))

         barIndex = iBarShift(NULL, 0, tick.time);

         ProcessOneTick(barIndex, tick, lastTick);

   }

      FileClose(hTicksFile);

 
Yaroslav Nykula:

Bonjour, ma chère... Pouvez-vous me dire pourquoi le code de trailing stop spécifié pour les ordres BUY fonctionne correctement ...

... ... mais le même pour les ordres de VENTE ne fixe pas de SL...

... La raison est probablement dans la condition(Ask+8*D*Point)<OrderStopLoss(), si nous la supprimons, SL sera mis, mais Trailing Stop fonctionne incorrectement sans la condition spécifiée ...

Pour les ordresBUY , lacondition(Bid-8*D*Point)>OrderStopLoss(), lorsqueOrderStopLoss()==0 est prisecorrectement (c'est-à-dire une valeur > 0) ...

... Maisla condition(Ask+8*D*Point)<OrderStopLoss(), lorsqueOrderStopLoss()==0 n' est pas considérée commecorrecte (c'est-à-dire qu'une certaine valeur est< 0

) ...

Veuillez m'indiquer comment formuler correctement dans le code la condition requise(Ask+8*D*Point)<OrderStopLoss()pour un fonctionnement correct duTrailing Stop avec les ordresSELL.

Je remercie d'avance tous ceux qui ont répondu

.

Bonjour à tous ... quelque chose de très faible activité dans cette branche du forum ... le problème est résolu de cette façon ...

 if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL&&OrderLots()<=Lot*3&&(Ask+(Tral+TP)*D*Point)<OrderOpenPrice()&&((OrderStopLoss()!=0&&(Ask+Tral*D*Point)<OrderStopLoss())||OrderStopLoss()==0))
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+Tral*D*Point,Digits),NormalizeDouble(OrderOpenPrice()-Stepp*D*Point,Digits),0,0);}} 

... C'est un peu long, mais ça marche... Qui sait comment l'écrire plus court, pouvez-vous le raccourcir, je vous en serais reconnaissant... le reste d'entre nous peut l'utiliser tel quel.

 

entrer la fonction

OrderCloseByTicket (542534564)

Fermer l'ordre par ticket avec le lot complet.

afin que vous n'ayez pas à spécifier les lots, le prix, le slippage.

similaire à cliquer une croix sur l'ordre dans le terminal.


entrer la fonction

OrderCloseByPos (0)

fermer la commande par position.


et alors il n'y aura plus besoin de prescrire ces constructions encombrantes.

  for (int i=1; i<=OrdersTotal(); i++)       //Цикл по всем ордерам,..
     {                                        //отражённым в терминале
      if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий
        {                                     
         // Здесь должен выполняться ..
         // ..анализ характеристик ордеров 
        }
     }                                        //Конец тела цикла
 

Bonjour ! Les deux nombres moins q et w sont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред
static bool res12=true;

start()
{   


   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}