[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 461

 

Können Sie mir sagen, warum in meinem Fall die Variable OrderSended nicht auf false gesetzt wird, wenn alle Bedingungen erfüllt sind?

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);
  }

Im Protokoll steht, dass MACD2 und MACD3 größer als Null sind, aber OrderSended ist immer noch wahr, obwohl es falsch werden sollte, wenn beide Variablen größer als Null sind.

 
sss2019:

Können Sie mir sagen, warum in meinem Fall die Variable OrderSended nicht auf false gesetzt wird, wenn alle Bedingungen erfüllt sind?

Im Protokoll steht, dass MACD2 und MACD3 größer als Null sind, aber OrderSended ist immer noch wahr, obwohl es falsch werden sollte, wenn beide Variablen größer als Null sind.

if(MACD2 < 0 && MACD3 > 0

und im Code ist eines größer als Null und das andere kleiner als Null

 
ilunga:

und in dem Code ist eins größer als null und eins kleiner als null.


Es handelt sich also nur um ein Signal zur Eröffnung einer Position, d.h. die Bedingungen sind größer als Null

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


Es handelt sich also nur um ein Signal zur Eröffnung einer Position, d.h. die Bedingungen sind größer als Null

Aber es ist trotzdem eine gute Idee, hier Klammern zu setzen, denn 99 % der Bedingungen werden nicht in der Reihenfolge berechnet, in der Sie sie gerne hätten:

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

 

Sagen Sie mir, ob dieser Entwurf funktionieren wird

if(OrdersTotal(MagicNumber))

Das heißt, wenn es Haftbefehle mit einer bestimmten magischen Zahl gibt, dann...

 
sss2019:

Sagen Sie mir, ob dieser Entwurf funktionieren wird

Das heißt, wenn es Haftbefehle mit einer bestimmten magischen Zahl gibt, dann...

nur wenn Sie die Funktion selbst schreiben
int OrdersTotal(int magic)
 
Sagen Sie mir, ob diese Funktion nach der Ausführung einer Funktion, z. B. for, einen einzelnen Wert oder alle Werte zurückgibt? Wenn beispielsweise in einer Schleife zwei Variablen ein Wert zugewiesen wurde, gibt die Schleife dann den Wert beider Variablen zurück oder nur den der letzten?
 

Also habe ich mein eigenes Ding mit Fraktalen gemacht - ich habe meinen eigenen Indikator geschrieben... Nun, für mich ist es einfacher. Hier ist die Frage: Ich habe ein Problem.

Wie verschiebe ich die Pfeile um 3 Takte nach hinten? :(

Ein kleines Stückchen 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:
Aber sagen Sie mir, nachdem eine Funktion ausgeführt wurde, z.B. for, gibt diese Funktion einen einzelnen Wert zurück oder alle? Wird in einer Schleife, in der zwei Variablen ein Wert zugewiesen wurde, der Wert beider Variablen oder nur der letzten Variablen zurückgegeben?

Was für ein Chaos...

1) for ist keine Funktion, es ist ein Schleifenoperator

2) die Funktion gibt nur das zurück, was ihr mit return mitgeteilt wurde

3) Variablen stehen in loser Beziehung zu Schleifen. Sie können bis zu 10 davon in einer Schleife ändern

 

Leute, ich kann nicht herausfinden, was los ist, es ist nicht klar, was mit dem Schließen von Bestellungen los ist:

Wenn es so ist, funktioniert es gut:

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);}
        
        //---------------------

Ich füge diesen Code unterhalb des oberen Codes ein:

//+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();
   }
   //--------------------------------- 

nach der ersten Funktion funktioniert nicht und schließt keine Aufträge ab. Ich sehe keine Fehler im Protokoll. Ich habe da einen Fehler gemacht, warum?


Ich habe alle Objekte unter beide Funktionen verschoben und es funktioniert.