[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 461

 

Puoi dirmi perché nel mio caso la variabile OrderSended non è impostata su false quando tutte le condizioni sono soddisfatte?

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

Dice che nel log MACD2 e MACD3 sono maggiori di zero, ma OrderSended è ancora vero, anche se dovrebbe diventare falso quando entrambe le variabili sono maggiori di zero.

 
sss2019:

Puoi dirmi perché nel mio caso la variabile OrderSended non è impostata su false quando tutte le condizioni sono soddisfatte?

Dice che nel log MACD2 e MACD3 sono maggiori di zero, ma OrderSended è ancora vero, anche se dovrebbe diventare falso quando entrambe le variabili sono maggiori di zero.

if(MACD2 < 0 && MACD3 > 0

ma nel codice, uno è maggiore di zero e l'altro è minore di zero

 
ilunga:

e nel codice, uno è maggiore di zero e uno è minore di zero.


Quindi è solo un segnale per aprire una posizione, cioè dove le condizioni sono maggiori di zero

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


Quindi è solo un segnale per aprire una posizione, cioè dove le condizioni sono maggiori di zero

e potresti voler mettere delle parentesi qui, perché il 99% delle condizioni non sono calcolate nell'ordine che vorresti:

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

 

Dimmi se questo design funzionerà

if(OrdersTotal(MagicNumber))

Cioè, se ci sono dei mandati con un numero magico specifico, allora...

 
sss2019:

Dimmi se questo design funzionerà

Cioè, se ci sono dei mandati con un numero magico specifico allora...

solo se si scrive la funzione da soli
int OrdersTotal(int magic)
 
Ditemi, dopo aver eseguito una funzione, ad esempio for, questa funzione restituisce un solo valore o tutti? Per esempio, in un ciclo un valore è stato assegnato a due variabili, il ciclo restituirà il valore di entrambe le variabili o solo l'ultima?
 

Così, ho fatto le mie cose con i frattali - ho scritto il mio indicatore... Beh, per me è più facile. Ecco la domanda: ho un problema.

come faccio a spostare le frecce indietro di 3 barre? :(

Un piccolo pezzo di codice...

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:
Ma ditemi, dopo l'esecuzione di una funzione, ad esempio for, questa funzione restituisce un solo valore o tutti? Per esempio in un ciclo un valore è stato assegnato a due variabili, il ciclo restituirà il valore di entrambe le variabili o solo l'ultima?

Che pasticcio...

1) for non è una funzione, è un operatore di ciclo

2) la funzione restituisce solo ciò che le è stato detto di restituire con return

3) Le variabili sono vagamente legate ai cicli. Potete cambiarne fino a 10 in un ciclo

 

Ragazzi, non riesco a capire cosa c'è che non va, non è chiaro cosa sta succedendo con la chiusura degli ordini:

Quando è così, funziona bene:

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

Aggiungo questo codice sotto quello superiore:

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

dopo la prima funzione non funziona e non chiude gli ordini. Non vedo alcun errore nel log. Ho fatto un errore, perché?


Ho spostato tutti gli oggetti giù per entrambe le funzioni e funziona.