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

 

Pouvez-vous me dire pourquoi, dans mon cas, la variable OrderSended ne prend pas la valeur false lorsque toutes les conditions sont remplies ?

int start()
  {
//----
   int i;
   int i2;
   double MACD;
   double MACD2 = iCustom(Symbol(),0,"MACD",5,21,1,0,0);
   double MACD3 = iCustom(Symbol(),0,"MACD",5,21,1,0,1);
   double MyNull = 0.0;
   int bar1;
   int bar2;
   static bool OrderSended = false;
   
   if(MACD2 > 0 && MACD3 > 0 || MACD2 < 0 && MACD3 < 0) // Вот эти условия
     {
     OrderSended = false;
     }
   Print("MACD2 = ",MACD2,"MACD3 = ",MACD3,"OrderSended = ",OrderSended);
   
   if(MACD2 < 0 && MACD3 > 0 && OrderSended == false)
     {
     if(OrderSend(Symbol(),OP_SELL,Lot,Ask,Slippage,Ask + StopLoss * Point,0,OrdersComment,MagicNumber,0,Red) > 0)
       {
       OrderSended = true;
       }
     }
//----
   return(0);
  }

Il est indiqué dans le journal que MACD2 et MACD3 sont supérieurs à zéro, mais OrderSended est toujours vrai, alors qu'il devrait devenir faux lorsque les deux variables sont supérieures à zéro.

 
sss2019:

Pouvez-vous me dire pourquoi, dans mon cas, la variable OrderSended ne prend pas la valeur false lorsque toutes les conditions sont remplies ?

Il est indiqué dans le journal que MACD2 et MACD3 sont supérieurs à zéro, mais OrderSended est toujours vrai, alors qu'il devrait devenir faux lorsque les deux variables sont supérieures à zéro.

if(MACD2 < 0 && MACD3 > 0

mais dans le code, l'un est supérieur à zéro et l'autre est inférieur à zéro.

 
ilunga:

et dans le code, un est supérieur à zéro et un est inférieur à zéro.


Donc c'est juste un signal pour ouvrir une position, c'est là que les conditions sont supérieures à zéro.

   if(MACD2 > 0 && MACD3 > 0 || MACD2 < 0 && MACD3 < 0) // Вот эти условия
     {
     OrderSended = false;
     }
 
sss2019:


Donc c'est juste un signal pour ouvrir une position, c'est là que les conditions sont supérieures à zéro.

Mais c'est toujours une bonne idée de mettre des parenthèses ici, car 99 % des conditions ne sont pas calculées dans l'ordre que vous souhaiteriez qu'elles le soient :

 if((MACD2 > 0 && MACD3 > 0) || (MACD2 < 0 && MACD3 < 0)) // Вот эти условия

 

Dites-moi si ce modèle fonctionnera

if(OrdersTotal(MagicNumber))

C'est-à-dire que s'il y a des mandats avec un nombre magique spécifique, alors...

 
sss2019:

Dites-moi si ce modèle fonctionnera

C'est-à-dire que s'il y a des mandats avec un nombre magique spécifique, alors...

seulement si vous écrivez la fonction vous-même
int OrdersTotal(int magic)
 
Dites-moi, après avoir exécuté une fonction, par exemple for, cette fonction renvoie-t-elle une seule valeur ou toutes les valeurs ? Par exemple, dans une boucle, une valeur a été attribuée à deux variables. La boucle renverra-t-elle la valeur des deux variables, ou seulement la dernière ?
 

Alors, j'ai fait mon propre truc avec les fractales - j'ai écrit mon propre indicateur... C'est plus facile pour moi. Voilà la question : j'ai un problème.

comment faire pour reculer les flèches de 3 barres ? :(

Un petit bout de code...

SetIndexStyle(0, DRAW_ARROW,0,1);
SetIndexArrow(0,217);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexEmptyValue(0, 0.0);
SetIndexStyle(1, DRAW_ARROW,0,1);
SetIndexArrow(1, 218);
SetIndexBuffer(1, ExtMapBuffer2);
SetIndexEmptyValue(1, 0.0);

IndicatorShortName("My_iFractals");
SetIndexLabel(0, "iFractalsUp");
SetIndexLabel(1, "iFractalsDn");

UPD

Вопрос снят, сорри опять за кривость свою, но может кому будет интересно ответ- SetIndexShift(0,-3);

 
sss2019:
Mais dites-moi, après l'exécution d'une fonction, par exemple for, cette fonction renvoie-t-elle une seule valeur ou toutes ? Par exemple, dans une boucle, une valeur a été attribuée à deux variables. La boucle renverra-t-elle la valeur des deux variables, ou seulement la dernière ?

Quel gâchis...

1) for n'est pas une fonction, c'est un opérateur de boucle.

2) la fonction ne renvoie que ce qu'on lui a demandé de renvoyer avec return.

3) Les variables sont vaguement liées aux boucles. Vous pouvez en modifier jusqu'à 10 dans une boucle.

 

Les gars, je n'arrive pas à comprendre ce qui ne va pas, ce n'est pas clair ce qui se passe avec la fermeture des commandes :

quand c'est comme ça, ça marche bien :

double PriceBid = Bid;
        double PriceAsk = Ask;
        PrevPriceBid = PriceBid;
        PrevPriceAsk = PriceAsk;
        double be = GetWeightedBELevel();
        if(be != -1)
        {
                double BuyLots = GetBuyLotsSum();
                double SellLots = GetSellLotsSum();
                
                double Swap = GetSwap();
                //string str = be + " ";
                if(Swap < 0)
                {
                        double diff = BuyLots - SellLots;
                        //str = str + MarketInfo(Symbol(), MODE_TICKVALUE) * diff + " " + (-Swap / (MarketInfo(Symbol(), MODE_TICKVALUE) * diff) * Point) + " ";
                        be += ND(-Swap / (MarketInfo(Symbol(), MODE_TICKVALUE) * diff) * Point + diff / MathAbs(diff) * 1 * Point);
                }
                //str = str + Swap + " " + be;
                //Comment(str);
                
                
                if((BuyLots > SellLots && ND(PrevPriceBid) < ND(be + (TakeProfitBuy) * Point) && ND(PriceBid) >= ND(be + (TakeProfitBuy) * Point)) ||
                        (BuyLots < SellLots && ND(PrevPriceAsk) > ND(be - (TakeProfitSell) * Point) && ND(PriceAsk) <= ND(be - (TakeProfitSell) * Point)))
                {
                        CloseAllBuy();
                        CloseAllSell();
                }
                

        }
                        ObjectDelete("ZeroBuy");
                if(BuyLots > SellLots)
                {double ZeroBuy = ND(be + TakeProfitBuy * Point);
                ObjectCreate("ZeroBuy",OBJ_ARROW,0,Time[0],ZeroBuy,0,0,0,0);                     
      ObjectSet   ("ZeroBuy",OBJPROP_ARROWCODE,6);
      ObjectSet   ("ZeroBuy",OBJPROP_COLOR, Olive);}
                        ObjectDelete("ZeroSell");
                if(BuyLots < SellLots)
                {double ZeroSell = ND(be - TakeProfitSell * Point);
                ObjectCreate("ZeroSell",OBJ_ARROW,0,Time[0],ZeroSell,0,0,0,0);                     
      ObjectSet   ("ZeroSell",OBJPROP_ARROWCODE,6);
      ObjectSet   ("ZeroSell",OBJPROP_COLOR, Olive);}
        
        //---------------------

J'ajoute ce code sous celui du haut :

//+X================================================================X+X+

  int b,s;
   double price,price_b,price_s,lot,lot_s,lot_b,SLb,SLs,SLbTwo,SLsTwo; //
   for (int i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {  if (OrderSymbol()==Symbol())
         {
            price = OrderOpenPrice();
            lot   = OrderLots();
            if (OrderType()==OP_BUY ) 
               {price_b = price_b+price*lot; b++;  lot_b=lot_b+lot;}
            if (OrderType()==OP_SELL) 
               {price_s = price_s+price*lot; s++;  lot_s=lot_s+lot;}
   }  }  }
   ObjectDelete("SLb");
   if (b!=0) 
   {  SLb = (price_b/lot_b)+TakeProfitBuy * Point;
      ObjectCreate("SLb",OBJ_ARROW,0,Time[0],SLb,0,0,0,0);                     
      ObjectSet   ("SLb",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLb",OBJPROP_COLOR, Navy);
   }
   ObjectDelete("SLbTwo");
   if (b!=0) 
   {  SLbTwo = (price_b/lot_b)+TakeProfitBuyTwo * Point;
      ObjectCreate("SLbTwo",OBJ_ARROW,0,Time[0],SLbTwo,0,0,0,0);                     
      ObjectSet   ("SLbTwo",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLbTwo",OBJPROP_COLOR, Navy);
   }
   
   ObjectDelete("SLs");
   if (s!=0) 
   {  SLs = (price_s/lot_s)-TakeProfitSell * Point;
      ObjectCreate("SLs",OBJ_ARROW,0,Time[0],SLs,0,0,0,0);                     
      ObjectSet   ("SLs",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLs",OBJPROP_COLOR, Maroon);
   }
   ObjectDelete("SLsTwo");
   if (s!=0) 
   {  SLsTwo = (price_s/lot_s)-TakeProfitSellTwo * Point;
      ObjectCreate("SLsTwo",OBJ_ARROW,0,Time[0],SLsTwo,0,0,0,0);                     
      ObjectSet   ("SLsTwo",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SLsTwo",OBJPROP_COLOR, Maroon);
   }
   
   if ((totalBuy > 1) && (SLb > Ask) && (SLbTwo < Ask) && (DnM15 > Bid)) //
   {
    CloseAllBuy();
   }
   if ((totalSell > 1) && (SLs < Bid) && (SLsTwo > Bid) && (UpM15 < Ask)) //
   {
   CloseAllSell();
   }
   //--------------------------------- 

après la première fonction ne fonctionne pas et ne ferme pas les ordres. Je ne vois pas d'erreurs dans le journal. J'ai fait une erreur, pourquoi ?


J'ai déplacé tous les objets vers le bas des deux fonctions et cela fonctionne.