[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 241

 

Question : comment calculer une série d'ordres perdants ? ???

Je veux savoir combien d'ordres d'affilée ont clôturé à un stop pour tester la tactique ... et surtout le dernier

Les gars, j'en ai vraiment besoin .....

 
VOLDEMAR:

Question : comment calculer une série d'ordres perdants ? ???

Je veux savoir combien d'ordres d'affilée ont fermé à un stop pour vérifier les tactiques... et surtout le dernier

Les gars, j'en ai vraiment besoin .....


Voici comment je le calcule pour moi :

Itération = combien de fois un ordre dans une rangée a clôturé à un stop si un stop dans votre sens est une clôture à perte.

 //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }
 
Merci ! Mais si je comprends bien, ce code trouve toute la série dans l'historique, que ce soit il y a 100 transactions ou 5 .....
 
VOLDEMAR:
Merci ! Mais si je comprends bien, ce code trouve toute la série dans l'historique, qu'il y ait eu 100 transactions ou 5 ......

Non. La sélection de la fermeture la plus proche se fait en profondeur dans l'historique, et quand une fermeture apparaît sur le profit, la série est interrompue avec la sortie du nombre de fermetures non rentables dans une rangée = Itération.
 

Bon après-midi.

Serait-ce la bonne combinaison ?

  // заполним значениями сигнальные массивы и посчитаем их количество
  for(i=DisplayBars;i>=0;i--) 
  {

    
if (Prz0 == 0) 
       {
           f= GetBarNumWithZerroDist(i);// на этом баре пересечение
        if (f!=-1)
          {
           Price01 = iClose(Symbol_1,0,f);
           Price02 = iClose(Symbol_2,0,f);
           Prz0 = 1;
           i=f;
           }
       } 
   }
int GetBarNumWithZerroDist(int i)
{
double Smb1Cl0 = NormalizeDouble(iClose(Symbol_1,0,0),Digits);
double Smb2Cl0 = NormalizeDouble(iClose(Symbol_2,0,0),Digits2);
double Smb1Pnt = MarketInfo(Symbol_1, MODE_POINT);
double Smb2Pnt = MarketInfo(Symbol_2, MODE_POINT);
int    mBars   = MathMin(iBars(Symbol_1,0), iBars(Symbol_2,0));

    for (int f=i;f>=0;f--) 
    {
        Price1 =   NormalizeDouble(Lot*(Smb1Cl0 - iClose(Symbol_1,0,f)) / Smb1Pnt,0);
        Price2 = NormalizeDouble(K*Lot2*H*(Smb2Cl0 - iClose(Symbol_2,0,f)) / Smb2Pnt,0);
        Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)== 0) return(f);
    }
    return(-1);
}
 

J'ai aimé celui-ci :)

if(MathAbs(Spread)== 0) return(f);
 
Roger:

J'aime bien celui-là :)


Y a-t-il une erreur ici ?

J'ai besoin de renvoyer la valeur de la barre où Spread==0,

Si aucune valeur de ce type n'est trouvée, retournez -1.

 

Bonjour.

Question : OrderSend() peut-il retourner une valeur de "0", ou inférieure à "-1" après exécution ? Quelqu'un a-t-il déjà rencontré un tel problème ? Ou bien les informations données dans la "documentation" sont-elles correctes ?

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Fonction de base utilisée pour ouvrir une position ou définir un ordre en suspens.
Renvoie le numéro de ticket qui est attribué à l'ordre par le serveur commercial, ou -1 en cas d'échec.
P.S. : je travaille comme télépathe, à la recherche d'une erreur dans le code de quelqu'un d'autre...
 
J'ai fait un chalut virtuel avec des lignes horizontales, dans le testeur cela fonctionne bien, mais lors de l'optimisation le testeur ne fonctionne apparemment pas avec ces lignes, pourquoi ?
 
DimaMA:
J'ai fait un chalut virtuel avec des lignes horizontales, il fonctionne bien dans le testeur, mais pendant l'optimisation le testeur ne fonctionne probablement pas avec ces lignes, pourquoi ? et comment le réparer ?

Pourquoi avez-vous besoin d'une ligne horizontale ? Stockez la valeur de la ligne dans une variable et vous serez heureux ! !! Et le conseiller expert "réfléchira" plus vite ! Et vous pouvez laisser la ligne horizontale juste pour l'effet visuel.

Et la raison est la suivante : le testeur travaille avec des objets graphiques uniquement en mode visuel ! Lors de l'optimisation, il n'y a pas de mode visuel du tout... Cependant, vous pouvez essayer de laisser le graphique avec "visuel" entre parenthèses après le nom de la TF et de la paire... Mais je ne sais pas si cela va aider ou non. Je ne l'ai pas vérifié. J'ai pensé que cela pourrait aider, car nous pouvons voir les ordres apparaître et disparaître sur ce graphique (qui a été utilisé pour les tests de visualisation avant) (même si le graphique n'a pas encore été activé)... Peut-être que quelqu'un nous le dira !

Je vous conseille de ne pas utiliser l'extraction des paramètres des objets graphiques. Que ces paramètres soient stockés dans des variables... Ne faites pas de l'objet graphique une variable ! :))))

Raison: