MQL5プログラミングにおけるマジックナンバーについて

MetaTrader 5
ニックネーム未設定
2022/03/04 13:46
969

下記記事の中に、

・MQL4プログラミングにおけるマジックナンバーとは?
https://labo.gogojungle.co.jp/articles/76

「1つのEAで複数のマジックナンバーを使用する場合もあります。このとき使用する全てのマジックナンバーを外部パラメータにすれば問題はありません。」

と記載がありますが、MQL5でも同様の考え方でプログラミングは可能なのでしょうか?
MQL4では、外部パラメータ指定のマジックナンバーでオーダーから約定までを管理することで、価格帯によって注文数やロットなどをコントロールできることは確認ができました。

MQL5では、ポジション、オーダー、ディールなど注文についての仕様が細かく取引も構造体になってますが、1つのEAで複数マジックナンバー指定することで短いコードでEA内注文管理ができるのではないかと考えての質問です。
見解を教えていただければ幸いです。

コメント

GogoJungle
2022/03/04 16:35

MQL5でも同様の考え方でプログラミングは可能でございます。
下記は、パラメーターでマジックナンバー 123456 を指定するサンプルでございます。

input int MagicNumber = 123456;

int OnInit()
  {
//---
   MqlTradeRequest request={};
   MqlTradeResult  result={};

   request.action   =TRADE_ACTION_DEAL;
   request.symbol   =Symbol();
   request.volume   =0.1;
   request.type     =ORDER_TYPE_BUY;
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   request.deviation=5;
   request.magic    =MagicNumber;

   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
//---
   return(INIT_SUCCEEDED);
  }

ご参考いただけますと幸いです。何卒よろしくお願い申し上げます。

ニックネーム未設定
2022/03/05 07:51

どうもありがとうございます。
頂戴したサンプルへ追記などして、MQL5でも複数マジックナンバーを設定できることを確認できました。

これを踏まえて実装できたらよいと思っているのですが、
1つのEA内でマジックナンバーを横串(ユニークIDのように使って)として、ロットや価格帯、注文数、発注タイミングなどを管理したいです。
グローバル変数でマジックナンバーをはじめとしてほかの変数を定義しておいて、意図したタイミングで逆指値注文をするというようなものです。

MQL4でいう、下記のようなものを作成したいのですが、どのようにすればよいのでしょうか?

int magic[100] = {100,101,102, … ,199};
int lots[3] = {0.1,0.2,0.3};
int tgr[100] = ****
int price[100] = ****

void OnTick()
{
int posi[100];ArrayInitialize(posi,0);
for(int i = 0; i < OrdersTotal(); i++){if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
for(int i = 0; i < 100; i++){if(OrderMagicNumber() == magic[i]){if(OrderCloseTime() == 0) {posi[i] = 99;}} }

int sign[100];ArrayInitialize(sign,0);
for(int i = 0; i < 100; i++){if(Ask > tgr[i] && pogi[i] != 99 ){ssign[e] = 88;}};
for(int i = 0; i < 100; i++){if(sign[i] == 88){if(OrderSend(Symbol(), OP_SELLSTOP, lots[2], price[**], 0, stoploss, takeprofit, NULL, magic[i], 0, clrRed)==true){};}}
}}

MQL5のフォーラムなどを参考にいろいろ探し、試したのですが、
PositionsTotal()やOrdersTotal()ぶんループさせて合致するマジックナンバーを取り出すというような処理では、なぜかずれてしまってうまくいきません。
八方ふさがりとなり、ここで質問させていただきました。
なにかヒントがあると助かります。。

GogoJungle
2022/03/05 14:43

逆指値注文が少ないことが前提でございますが、1つのEAを作成し、EAをチャート適用時に
シンプルなパラメーター(配列ではない)を都度変更すれば、問題ないかと存じます。

逆指値注文が多い場合は、複数のマジックナンバーを定義する必要性も含めまして
差し支えなければ、どのようなロジックかご説明いただければ幸いでございます。

ニックネーム未設定
2022/03/12 06:05

ご返信ありがとうございます。
いろいろ試してみてできました。
ずれていた原因は、PositionGetTicket関数でインデックス番号を取得してループ処理する際に、
先日投稿したような「(int i = 0; i < OrdersTotal(); i++)」と前から処理するのではなく、「for (int i = PositionsTotal(); i >= 0; i–)」として後ろから処理していく手順にしていなかったためでした。

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。