[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 461

 

Подскажите почему в моем случае перемення OrderSended не принимает значение false когда все условия соблюдены?

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

Написано в журнале MACD2 и MACD3 больше нуля, а OrderSended все равно равен true, хотя должен стать false когда обе переменные больше нуля.

 
sss2019:

Подскажите почему в моем случае перемення OrderSended не принимает значение false когда все условия соблюдены?

Написано в журнале MACD2 и MACD3 больше нуля, а OrderSended все равно равен true, хотя должен стать false когда обе переменные больше нуля.

if(MACD2 < 0 && MACD3 > 0

а в коде одно больше нуля, второе меньше

 
ilunga:

а в коде одно больше нуля, второе меньше


Так это всего лишь сигнал на открытие позиции, вот в этом то месте условия больше нуля

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


Так это всего лишь сигнал на открытие позиции, вот в этом то месте условия больше нуля

а тут все-таки хорошо бы скобок поставить, потому что 99% вычисление условий идет не в том порядке, в каком вам бы хотелось:

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

 

Скажите а вот такая конструкция будет работать

if(OrdersTotal(MagicNumber))

То есть если есть ордера с конкретным магическим номером то...

 
sss2019:

Скажите а вот такая конструкция будет работать

То есть если есть ордера с конкретным магическим номером то...

только если сами напишете функцию
int OrdersTotal(int magic)
 
А вот скажите мне после выполнения какой нибудь функции, например for эта функция возвращает какое то одно значение или все которые использовались? Например в цикле двум переменным присвоилось значение, то цикл вернет значение обоих переменных, или только последней?
 

Так, с фракталами я разобрался по свойски- написал индикатор по своему... ну мне проще. Вопрос такой- у меня проблема

как сместить на 3 бара назад стрелочки? :(

Кусочек кода...

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:
А вот скажите мне после выполнения какой нибудь функции, например for эта функция возвращает какое то одно значение или все которые использовались? Например в цикле двум переменным присвоилось значение, то цикл вернет значение обоих переменных, или только последней?

ну и кашица..

1) for это не функция, это оператор цикла

2) функция возвращает только то, что ей сказали вернуть с помощью return

3) переменные с циклами слабо связаны. Вы можете в цикле их хоть 10 изменять

 

ребята, не моу понять в чем дело, такая ситуация с закрытием ордеров получается не понятная:

вот так вот когда, то работает все отлчно:

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

добовляю такой код ниже верхнего:

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

после первая функция уже не срабатывает и не закрывает ордера. В журнале ни каких ошибок не выдает. Чего оно так, где я допустил ошибку?


Вынес все Object вниз обех функций и заработало. вопрос снят!

Причина обращения: