MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 39

 
trader781:
どう説明したらいいのかわからない。でも、間違いなく名作です。
この辺は皮肉が好きなんですよ(笑)。トリシュキンはそれに腹を立て、コードを用意すると言った。
 
Movlat Baghiyev:
この辺の皮肉が好きなんだと言っているんだ )))トリスキンもこれに腹を立てた。 コードがあるから助けてくれる、と。

私もあなたと同じように初心者ですが、そんな私にもたくさんの疑問があります。

for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i.),SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY||)OrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
else b++;
if(OrderType()==OP_SELLSTOP)
if(signal_sell)OrderDelete(OrderTicket());
else s++;
}.

}

1)b++はどこで手に入れたのですか?

2)s++は どこで手に入れましたか?

3)if(signal_bue) is what else?

そして残りのコードも。気を悪くされたらごめんなさい。

 
それが正しいのでしょう
//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if (TrailingStop!=0) Trailing();
  
   //ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
  
   int b = 0, s = 0, p = 0, res = 0;

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
   for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        if (OrderType()==OP_BUYSTOP)
        {
           if(RSI0<50&&RSI1>50)
                OrderDelete(OrderTicket());
            else
                b++;
        }
        if (OrderType()==OP_SELLSTOP)
        {
           if(RSI0>50&&RSI1<50)
                OrderDelete(OrderTicket());
              else
                s++;
        }
      }
    }

   double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить

//---- buy stop
   if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----
   return(0);
}
 
Movlat Baghiyev:
この辺は皮肉が好きなんですよ(笑)。トリシキンはそれを見て怒ったんだ コードで助けると言ったんだ

その方がシンプルでいいですよね。

void OrderDelete_(int Type)
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            OrderDelete(OrderTicket());
        }
     }
  }

void OnTick()関数の外側のどこかにあります。

if (сигнал_bue) OrderDelete_(OP_SELLSTOP);

if (сигнал_sell)OrderDelete_(OP_BUYSTOP);

そして、これはvoid OnTick()関数 本体の中です。

 
Alekseu Fedotov:


そして、これは void OnTick()関数 本体の中にあります。

コードに修正を加えてください
 
trader781:

なるほど。

できることは、なんとなく終わらせた。描写はできている。目的は、なぜ思い通りに動かないのかを理解するためです。

if()ブロックの中にelseが あります。本当にこのような意図があったのでしょうか?

さらにCounts()関数は、初期化されていないグローバル変数 countを受け入れ、さらに、関数内部でもう一度定義されます。

Counts()関数は注文をカウントしますが、メイン関数内で何度か変更されるあるチケットと比較します。ただし、ファンクション操作中のチケットの値は同じです。では、この関数はいくつのオーダーを計算するのでしょうか。複数あるのでしょうか?

この形式では、この関数は引数を必要とせず、ただ呼び出して結果を返すだけである。

次のページ関数FindLastOType()は、再びチケットとの比較になります。有効なチケットと比較して保証できるのか?必要なマジックナンバーとシンボルを持つ最初の注文が見つかった時点でループを中断し、注文の種類を返す方がシンプルではないでしょうか?

FindLastOrderOpenPrice()、FindLastLot()と同じです。

ModifyOrders()関数は、悪夢を見ずに眠るために長い間調べないほど、私をぞっとさせた...。

 
Movlat Baghiyev:
コードに修正を加えてください

使ってみてください ^_~。

extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  int  res = 0;

//ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
//---- buy stop
   if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----  
  
  
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);

if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);

  }

//+------------------------------------------------------------------+
void OrderDelete_(int Type)
  {
  bool  r;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
          r = OrderDelete(OrderTicket());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
  {
  int kp=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            kp++;
        }
     }
  return(kp);  
  }
//+------------------------------------------------------------------+
 
アレクセウ・フェドートフ ありがとうございます 神のご加護を。
 
Vitalie Postolache:

if()ブロックの中にelseが あります。本当にそういうことだったのだろうか。

さらにCounts()関数は、初期化されていないグローバル変数 countを受け取りますが、この変数も関数自体の中でもう一度宣言されます。

Counts()関数は注文をカウントしますが、メイン関数内で数回変化するあるチケットと比較します。ただし、ファンクション操作中のチケットの値は同じです。では、この関数はいくつのオーダーを計算するのでしょうか。複数あるのでしょうか?

この形式では、この関数は引数を必要とせず、ただ呼び出して結果を返すだけである。

次のページ関数FindLastOType()は、再びチケットとの比較になります。有効なチケットと比較して保証できるのか?必要なマジックナンバーとシンボルを持つ最初の注文が見つかった時点でループを中断し、注文の種類を返す方がシンプルではないでしょうか?

FindLastOrderOpenPrice()、FindLastLot()と同じです。

Function ModifyOrders()が怖くて、夜中に悪夢を見ないように、ずっと調べないようにしていたのですが...。

訂正

それ以外の場所に置くと、間違ったパラメータになってしまうからです

最新の情報を考慮する必要があります。

変えてみる。

標準のOrderModify()を使ってみたが、大量の注文を同時に動かすと禁止され、常に

講評をありがとうございました。

 
spoiltboy:
はい、ブラケットの誤植です。それ以外の質問は有効です。

bool condition;

if(condition) {}

と同じ

if(condition==true) {}

и

if(!condition) {}

イコール

if(condition==false) {}

ただ、より短く、より身近になっただけです。