Vérifiez - qu'est-ce que j'ai fait de mal ?

 

Écriture du code

int GetN()
{
   int n = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
      {
         bool profit = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
         
         bool loss = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
         
         bool neutral = OrderClosePrice() == OrderOpenPrice();

            SumPosOrder = OrderLots();
            Tiket2 = OrderTicket();
           }


         if(loss)
           {
            n++;
            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
           }

         if(n >= MartinSteps)
           {
            n = 0;
            break;
           }

         if(profit)
           {
            ObchPlus = ObchPlus + (SumPosOrder * 0.8); // Расчет для Бинарных опционов поэтому умножаю на 0,8
           }

         if(profit && ObchPlus < ObchMin)
           {
            n++;
            Pobeda++;
            Sdelok++;
           }



         if(profit && ObchPlus > ObchMin)
           {
            ObchPlus = 0;
            ObchMin = 0;
            Pobeda++;
            Sdelok++;
            n = 0;
            break;
           }
        }
     
   return n;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+

La tâche était à l'origine :
Trouver le dernier ordre clôturé.
Vérifiez si elle s'est fermée en position plus ou moins.
Comptez le nombre de transactions
Comptez le nombre de transactions positives et négatives.

Calculez le montant de la mise.


Si la transaction est profitable (et que le total des moins = 0), alors le pari numéro 1
Si la transaction est négative, alors comptez les moins et pariez le numéro 2
Si plus, mais moins > 0, alors le pari suivant.
Mais pour une raison quelconque, il ne compte pas correctement le nombre de paris et le montant du pari...

 

par exemple, la chaîne

bool neutral = OrderClosePrice() == OrderOpenPrice();

nous devrions probablement façonner le fonctionnement des conditions algorithmiques comme ceci :

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

et les deux autres conditions dans la même veine

 

D'ailleurs, la dernière transaction dans l'histoire n'est pas toujours la dernière transaction dans le temps.

 
Nikita Chernyshov #:

D'ailleurs, la dernière transaction dans l'histoire n'est pas toujours la dernière transaction dans le temps.

Oui, j'ai supprimé l'échantillonnage du temps, mais ça ne fonctionne toujours pas...
Renat Akhtyamov #:

par exemple, la ligne

peut-être devrions-nous former le travail des conditions algorithmiques comme ceci :

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

et les deux autres conditions dans la même veine

J'ai juste utilisé ce bloc avant dans d'autres systèmes et il a parfaitement fonctionné dans cette partie.
mais quand même, je vais certainement vérifier et réécrire. Je vous ferai part du résultat.
 
Natalya Smirnova #:
Oui, j'ai supprimé l'échantillonnage du temps, mais cela ne fonctionne toujours pas... J'ai juste utilisé ce bloc avant dans d'autres systèmes et il a parfaitement fonctionné dans cette partie.
mais quand même, je vais certainement vérifier et réécrire. Je vous ferai part du résultat.

Ces variables sont-elles réinitialisées quelque part ?

            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
 
Renat Akhtyamov #:

Ces variables sont-elles réinitialisées quelque part ?

Oui, au démarrage, ils ont une valeur de 0
et avant l'achèvement.
 
Renat Akhtyamov #:

Ces variables sont-elles mises à zéro quelque part ?

Peut-être qu'il faut passer de la première à la dernière.
Je vais retirer la collecte des statistiques de cette fonction pour l'instant, et le minus général et les statistiques dans une autre (la fonction séparée produira)

L'écriture par blocs.

Rassembler des statistiques et calculer les moins et les plus (les moins et les plus sont des variables globales).

if(OrderSelect((OrdersHistoryTotal() - 1), SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
              {
               if(OrderTicket() != Tiket2)
                 {
                  bool profit1 = false;
                  if(OrderClosePrice() > 0)
                    {
                     profit1 = true;
                    }
                  bool loss1 = false;
                  if(OrderClosePrice() < 0)
                    {
                     loss1 = true;
                    }


                  SumPosOrder = OrderLots();
                  Tiket2 = OrderTicket();
                  Print(OrderCloseTime());
                 


               if(loss1)
                 {
                  ObchMin = ObchMin + SumPosOrder;
                  Minus++;
                  Sdelok++;
                 }



               if(profit1)
                 {
                  ObchPlus = ObchPlus + (SumPosOrder * 0.8);
                 }

               if(profit1 && ObchPlus < ObchMin)
                 {

                  Pobeda++;
                  Sdelok++;
                 }




               if(profit1 && ObchPlus > ObchMin)
                 {
                  ObchPlus = 0;
                  ObchMin = 0;
                  Pobeda++;
                  Sdelok++;

                 }
}


Bloc 2 - sélection de la variable n pour le calcul (ou plutôt la sélection) du taux

int GetN()
  {
   int n = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
        {
         bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;


        }


      if(loss)
        {
         n++;
        }

      if(n >= MartinSteps)
        {
         n = 0;
         break;
        }

      

      if(profit && ObchPlus < ObchMin)
        {
         n++;
        }



      if(profit && ObchPlus > ObchMin)
        {
         n = 0;
         break;
        }
     }

   Print(n);

   return n;
  }


double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+


Ce serait probablement correct...

 

Je ne comprends pas la logique.

Comment cela ?

bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;

Comment le prix de clôture de l'ordre peut-il être inférieur à zéro ?

L'ordre d'achat est rentable si le prix de clôture est supérieur au prix d'ouverture.

voici la condition d'un achat plus (hors commissions et swap) :

OrderClosePrice() > OrderOpenPrice()
Si c'est l'inverse, c'est un moins.
 
Renat Akhtyamov le prix de clôture de l'ordre peut-il être inférieur à zéro ?

L'ordre d'achat est rentable si le prix de clôture est supérieur au prix d'ouverture.

voici les conditions d'un achat plus (hors commissions et swap) :

Si c'est l'inverse, c'est un moins.

Comme j'écris pour les options binaires, j'ai fait les choses un peu différemment :

if(OrderProfit() > 0)


Ce serait probablement correct ?

 
Natalya Smirnova #:

Peut-être qu'il faut passer de la première à la dernière.
Je vais retirer la collecte des statistiques de cette fonction pour le moment, et le total moins et les statistiques dans une autre (fonction séparée que je produirai)

Écriture par blocs

Moins et plus cumulés (moins et plus sont des variables globales)


Bloc 2 - sélection de la variable n pour le calcul (ou plutôt la sélection) du taux


Ce serait probablement correct...

Je ne veux pas interférer et je n'ai même pas regardé votre code et vos conseils...

double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }

a attiré mon attention. A ce propos, une question : n'est-il pas plus simple et plus lisible d'utiliser l'opérateur de commutation

double SelectVolume(int n)
  {
   double Volume = 0.0;
    switch(n)
    {
     case 1  :  Volume = Volume2;     break;
     case 2  :  Volume = Volume3;     break;
     case 3  :  Volume = Volume4;     break;
     case 4  :  Volume = Volume5;     break;
     case 5  :  Volume = Volume6;     break;
     case 6  :  Volume = Volume7;     break;
     case 7  :  Volume = Volume8;     break;
     case 8  :  Volume = Volume9;     break;
     case 9  :  Volume = Volume10;    break;
     default :  Volume = Volume1;     break;
    }
   return(Volume);
  }
Je pense que c'est plus facile à lire et à comprendre. Peut-être que ça marche aussi un peu plus vite.
 
Alexey Viktorov #:

Vous avez déjà reçu des conseils sur l'ensemble de l'algorithme, je ne veux pas interférer et je n'ai même pas regardé votre code et les mêmes conseils... Mais ceci

a attiré mon attention. A ce propos, une question : n'est-il pas plus simple et plus lisible d'utiliser l'opérateur de commutation

Je pense que c'est plus facile à lire et à comprendre. Peut-être que cela fonctionne aussi un peu plus vite.
Comme je ne suis pas très expérimenté, votre suggestion est totalement nouvelle pour moi.
Au départ, je l'ai fait comme je l'ai trouvé, ça a marché, alors je n'ai pas pensé à l'améliorer.
Vous savez ce qu'on dit - ça marche - n'y touchez pas.

Mais maintenant, je vais certainement essayer d'appliquer cette méthode. Parce qu'il est nécessaire d'apprendre et de se développer.

Mais je ne m'occuperai que de ma variable n pour l'instant. Il ne veut pas être compté.
toujours n = 0 (jusqu'à présent)