[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 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が0より大きいと書いてありますが、両方の変数が0より大きいと偽になるはずなのに、OrderSendedはまだ真です。

 
sss2019:

私の場合、すべての条件を満たしたときにOrderSended変数がfalseに設定されないのはなぜか教えてください。

ログにMACD2とMACD3が0より大きいと書いてありますが、両方の変数が0より大きいと偽になるはずなのに、OrderSendedはまだ真です。

if(MACD2 < 0 && MACD3 > 0

で、コード上では、一方が0より大きく、他方が0より小さくなっています。

 
ilunga:

であり、コード上では、1が0より大きく、1が0より小さい。


つまり、ポジションを開く ためのシグナルに過ぎず、それは条件がゼロより大きいところです

   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などの関数を実行した後、この関数は単一の値を返すのでしょうか、それともすべての値を返すのでしょうか?例えば、ループの中で2つの変数に値が代 入された場合、ループは両方の変数の値を返すのか、それとも最後の1つの変数の値だけを返すのか?
 

そこで、私はフラクタルで自分なりに工夫をし、自分でインジケータを書き ました...。まあ、その方が楽なんですけどね。ここで問題が発生しました。

矢印を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などの関数が実行された後、この関数は単一の値を返すのでしょうか、それともすべての値を返すのでしょうか?例えば、ループの中で2つの変数に値が代入された場合、ループは両方の変数の値を返すのでしょうか、それとも最後の1つだけを返すのでしょうか?

なんということでしょう・・・。

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

の後、最初の関数が動作せず、注文を閉じることができません。ログにエラーは出ていないのですが。そこを間違えてしまったのですが、なぜですか?


両機能の下にあるすべてのオブジェクトを移動させ、動作しています。 疑問は解決しました!