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

 
Motzaart:

午後

多通貨のExpert Advisorで、オープンポジションがトリガーされたときに、利益に対して発注された保留中の注文を 閉じる必要があります。

今現在、利益確定の保留注文を決済すると、全通貨の保留注文が決済されます。

ある通貨ペアに関連する保留中の注文だけが決済され、残りの保留中の注文は未決済のままとなるようにコードを変更するにはどうすればよいですか?

このコードのどこを変えればいいのでしょうか?

このコード内のMnは、BUY_STOPまたはSELL_STOPの保留中の注文のマジックナンバーです。

ロジックとしては、Take Profitでオープンポジションを決済すると、このマジックナンバーが残り、これを削除するコマンドが実行されることになっています。

これは、各ペアをテストするときに有効です。ただし、他の通貨を扱う場合は、すべてのペアで発注された注文が削除されます。

できれば、助けてください。

この問題で悩む人はいないはずだと理解していますが、もしかしたら誰かが既成のテンプレートを持っているかもしれませんね。

とてもありがたいことです。

私は、あなたがそこで何を台無しにしたのか理解するために、エディタにコードをコピーして、通常のスタイリング(Ctrl+<)を行う必要がありました。

そこで:そこでごちゃごちゃ言っていたことをコードにコメントしました。

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

その結果、あなたのコードはこうなります、つまり、このコードと同等です。

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

今、問いかける--そこから何を得ようとしたのか?

 
Artyom Trishkin:

あなたがそこで何を台無しにしたかを理解するために、私はエディタにコードをコピーして、適切なスタイリング(Ctrl+<)を行う必要がありました。

So: そこで台無しにしたものをコードにコメントしました。

その結果、あなたのコードはこうなる、つまり、このコードと等しくなるのです。

今、問いかける--そこから何を得ようとしたのか?

OKです。

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

をご覧ください。

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

ポジションがオープン(OP_BUYまたはOP_SELL )されると、同時にそれぞれ保留の注文(OP_SELLSTOPとOP_BUYSTOP)を出します。

テイクプロフィットで建玉を決済する場合、それに対応する保留注文はキャンセルされなければなりません。このアルゴリズムは、すべての通貨ペアに適用されます。

他の通貨で発注した保留中の注文はそのままにしておきます。

 

皆さん、ごきげんよう。

MTF_RSIが切り替わっているインジケータがあります。

input ENUM_TIMEFRAMES      TimeFrame   =  0;

チャート切り替え時にTimeFrameを自動的に変更する設定は可能でしょうか?

のようなものです。

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

皆さん、ごきげんよう。

MTF_RSIが切り替わっているインジケータがあります。

チャート切り替え時にTimeFrameを自動的に変更する設定は可能でしょうか?

こんな感じ

構造体や多次元 配列を作り、目的の次元で実行させ、基準を満たせば1列(各列はそれぞれの時間軸を担当)、満たさなければ別の列で作業、以上です。プログラム自体はすべてのタイムフレームに一度にアクセスできるので、お書きになったことは可能ですが、実装は非常に大掛かりなため、フォーラムではこの分量を見ることができません。

 
Seric29:

構造体または多次元配列の 作成

ありがとうございます。

 

なぜこのコードは動かないのか?

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

簡単な機能で動作するのですが、何か変なんです。

 
MakarFX:

ありがとうございます。

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
私に言ってるの?
 
MakarFX:
私に言ってるの?

Yes to you.すべてのループ、すべての関数において、細部まで時間軸を意識してゲームを進めていく必要があります。そのため、多次元配列の 利用を推奨しています。

 
Seric29:

Yes to you.すべてのループ、すべての関数において、細部まで時間軸を意識してゲームを進めていく必要があります。そのため、多次元配列の 利用を推奨しています。

この問題は、もっと簡単に解決できます。

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }