• 締切済み

MT4のEAで通貨ペア毎に最大ポジション数を設定出来るものをプログラムしたい

現在MT4で独自のEAを作ろうとプログラムの勉強をしているのですが、 同じEAを同時に複数の通貨ペアで動かし、尚且つ1通貨ペア当たりの同時に持てる最大ポジション数を使用者側で(Externで)設定出来るようにしたいです。 具体的に言いますと、同時に持てるポジションの数を USDJPYは最大2つ GBPJPYは最大3つ AUDJPYは最大1つ と、設定して上記3つの通貨ペアで同じEAを動かした時に、 ポジションの合計が上記通り(最大で6個)になるようなものを作りたいのですが、 どうしたらよいのでしょうか? (プログラム上部) extern int MaxOrder=2; //使用者側で設定出来る同時に持てる最大ポジション数 (int start()内) int order=0; for(int i=OrdersTotal()-1; i>=0; i- -) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) order=order+1; } if(order>0) {  if(決済条件)  {  決済プログラム;  } } if(order<MaxOrder) {  if(エントリー条件)  {  エントリープログラム;  } } みたいなプログラムでやってみたり、実は他にもいろいろと試しているのですが、うまくいきません。 プログラム初心者なので出来れば詳細に教えていただけると助かります。 宜しくお願い致します。

みんなの回答

  • fxsarah
  • ベストアンサー率45% (16/35)
回答No.1

MaxOrderの値を、Symbol()によって設定するしかないでしょう。

greyseal
質問者

お礼

度々の自己レス申し訳ありません。 どうやら解決できた気がします。 メインスレのプログラム中には必要ないと思ったので記載しなかったのですが、ticket変数の宣言場所に間違いがあったようで、下記の様にしたところ大丈夫でした。 (プログラム上部) extern int MaxOrder=2; //使用者側で設定出来る同時に持てる最大ポジション数 int start() { int order=0; int ticket=0; for(int pos=OrdersTotal()-1; pos>=0; pos- -) { if(OrderSelect(pos,SELECT_BY_POS)= =false) continue; if(OrderSymbol()= =Symbol() && OrderMagicNumber()= =MagicNumber) order+ +; } if(order>0) { if(買いポジションの決済条件) 買いポジション決済関数; if(売りポジションの決済条件) 売りポジション決済関数; } if(order<MaxOrder) { if(買いポジションのオープン条件) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Example_EA",MagicNumber,0,Blue); if(TP>0) { if(ticket>0) { OrderSelect(ticket,SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,0,Blue); } } if(SL>0) { if(ticket>0) { OrderSelect(ticket,SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),Ask-SL*Point,OrderTakeProfit(),Blue); } } return(0); } else if(売りポジションのオープン条件) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Example_EA",MagicNumber,0,Red); if(TP>0) { if(ticket>0) { OrderSelect(ticket,SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,0,Red); } } if(SL>0) { if(ticket>0) { OrderSelect(ticket,SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),Bid+SL*Point,OrderTakeProfit(),Blue); } } return(0); } } } ありがとうございました。

greyseal
質問者

補足

fxsarahさん、ご回答ありがとうございます。また返答が遅くなりまして申し訳ありません。 >MaxOrderの値を、Symbol()によって設定するしかないでしょう。 とは、具体的にはどういうプログラムを書けばいいのでしょうか? fxsarahさんからご返答をいただく前にもいろいろと試しており、ちょっと混乱しております。 お手数ですがもう少し詳細にお教えいただけると助かります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MT4のEAがエントリーしません

    上向きの移動平均線をローソク足が下から抜けたら買いエントリーし、4本値すべて移動平均線の下にいったらイグジット、売りは逆というEAをiCutomの本を見ながら作ってみたのですが、ポンド円の一分足で半日稼働したけれど全くエントリーしませんでした。どこがわるいのでしょうか?宜しくお願いします。(以下が内容です)因みにコンパイルしてエラーはありませんでした。 // マジックナンバーの定義 #define MAGIC 5582 // パラメーターの設定// extern int MA_Period = 21; // 短期移動平均線の期間設定 extern int MA_Shift = 0; // 移動平均を右にシフトするバー数の設定 extern int MA_Method = 0; // 移動平均方法の設定 extern double Lots = 1.0; // 取引ロット数 extern int Slip = 100; // 許容スリッページ数 extern string Comments = " "; // コメント // 変数の設定// int Ticket_L = 0; // 買い注文の結果をキャッチする変数 int Ticket_S = 0; // 売り注文の結果をキャッチする変数 int Exit_L = 0; // 買いポジションの決済注文の結果をキャッチする変数 int Exit_S = 0; // 売りポジションの決済注文の結果をキャッチする変数 double MA_2 = 0; double MA_1 = 0; int start() { MA_2 = iCustom(NULL,0,"Moving Averages",MA_Period,MA_Shift,MA_Method,0,2); MA_1 = iCustom(NULL,0,"Moving Averages",MA_Period,MA_Shift,MA_Method,0,1); // 買いポジションのエグジット if( MA_1 >= High[1] && ( Ticket_L != 0 && Ticket_L != -1 )) { Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red); if( Exit_L ==1 ) {Ticket_L = 0;} } // 売りポジションのエグジット if( MA_1 <= Low[1] && ( Ticket_S != 0 && Ticket_S != -1 )) { Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue); if( Exit_S ==1 ) {Ticket_S = 0;} } // 買いエントリー if( MA_2 <= MA_1 && MA_1 > Open[1]&& MA_1 > Close[1] && ( Ticket_L == 0 || Ticket_L == -1 ) && ( Ticket_S == 0 || Ticket_S == -1 )) { Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red); } // 売りエントリー if( MA_2 >= MA_1 && MA_1 < Open[1]&& MA_1 > Close[1] && ( Ticket_S == 0 || Ticket_S == -1 ) && ( Ticket_L == 0 || Ticket_L == -1 )) { Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue); } return(0); }

  • MT4でのカウントダウン方式でのEAについて

    MT4初心者です。 サイバーエージェントMT4のデモトレードでEA作成にチャレンジしております。 EAのプログラムではストップロスの値幅とテイクプロフィットの値幅をexternでパラメーターに設定し、OrderSend関数の引数として代入していたのですが、サイバーエージェントではカウントダウン注文方式なので、エントリーの際にOrderSend関数でスリッページとストップロス、テイクプロフィットの値を0にしないとエントリーが出来ない事を知りました。 とりあえず、上記の値を0にしデモトレードをしてみたのですが、エントリーには成功しました。 ただ、エントリーは出来ても当然、指値・逆指値の注文が入らないので、エントリー後に注文を入れようと思い、OrderModfiyの関数を使ってみて下記の様なプログラムを組んでみたのですが、エントリー後もOCO注文は入りません。 MyOrderSendSL(OP_BUY, Lots, Ask, 0, 0, 0, COMMENT, MAGIC); OrderModify(OrderTicket(), 0, OrderOpenPrice()-SLpips*Point, OrderOpenPrice()+TPpips*Point, 0); 初心者の為、全くのおかど違いな事をしているのかも分からない状態です。 エントリー後、直ぐににオープンポジション(約定値)に対してのOCO注文(出来れば値幅をパラメーターとした注文)のプログラムの組み方をご存知の方がいらっしゃいましたら教えていただけますでしょうか。

  • javaで素数を探すプログラム。

    javaで素数を探すプログラム。 初歩的なことかと思いますが、助言をお願いします。 if(a[i-1]) ←この部分がわかりません。これはどのような条件がなのでしょうか? class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } このプログラム

    • ベストアンサー
    • Java
  • 素数のプログラムについて教えてください

    3000000以下の素数を降順に表示するプログラムをつくりたいのですが、int mainのところがわかりません。 #include <iostream> int PRIME(int m) int main() { int m, j; for(m = 3000000; m <= 2; m--) } int prime( int n ) { int i; for ( i = 2; i < n; i++ ) { if ( n % i == 0 ) { return 0; } } return 1; } 誰か教えていただけないでしょうか? よろしくお願いします。

  • 素数を判定するプログラム

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。

  • 素数を判定するプログラム

    素数を判定するプログラムをC言語で作れという問題があったのですが、以下のものをビルドして実行したら途中で止まってしまいました。(例えば5と入力する)しかし、1以下の場合は正常にif文が評価されました。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n; int i; printf("1より大きい整数を入力してください: "); scanf("%d", &number); if (number <= 1) { printf("1より大きい整数を入力してください\a: "); scanf("%d", &number); } for (n = 2; n = number - 1; n++) { i = number % n; if (i = 0) { printf("%dは素数ではありません", number); break; } } printf("%dは素数です", number); return 0; } 自分ではどこがおかしいのかさっぱりわかりません。よろしくお願いします。

  • FXの最大ロット購入数の計算

    FXで、資金から見て購入できるロット数の最大値の計算方法を教えてください。 例えば、 資金:20,000円 レバレッジ:25倍 通貨単位:100通貨 エントリーした価格(ポジション):104.4円 この場合、 1ロットにかかる金額: 104.4×100÷25=417.6 最大購入可能ロット数: 20,000÷417.6=47.8... 購入可能なロット数の最大は端数切り捨てで、47ロット この計算式であってるでしょうか? 間違っていたら計算式も記載して回答をください。 回答よろしくお願いします。

  • 素数を求めるプログラム

    1000以下の素数を求めるプログラムについての問題について考えているのですが、何故2の数のとき、乗除を行う回数が加算されないのかが分かりません。また、3のとき乗除を1回しか行わないのか分かりません。理論的に2が素数となるのは定義付けられているから必要ないのか、とも思ったのですがそれならcounter++で2が範囲にあるのに加算されないという理由がよくわかりません。 初歩的な問題ですみませんが回答頂けると有難いです。 プログラムは下記の通りです。 #include <stdio.h> int main(void) { int i,no; unsigned long counter = 0; for (no = 2; no <= 1000; no++) { for (i = 2; i < no; i++) { counter++; if (no % i == 0) break; } if (no == i) printf("%d\n" , no); } printf("乗除を行った回数:%lu\n" , counter); return (0); }

  • C言語 最大値と最小値を求めて表示するプログラム

    はじめまして。 C言語を学習中です。 下記の問題演習の解答として記載されているプログラムがどうしても理解できません。 特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。 while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; 具体的に教えてください。 よろしくお願い致します。 ●問題 0~100の範囲で入力された複数の数値の中から、 最大値と最小値を求めて表示するプログラムを作成せよ。 -1が入力された場合は入力の終わりと判定する。 ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。 また、入力された数値を記憶する配列の要素数は10とし、 それ以上入力された場合はエラーが起きても仕方ないこととする。 ヒント:配列の中に -1 があればデータの終わりだと判断できる。 ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。 ●解答 #include <stdio.h> void maxmin(int array[],int *max,int *min); int main(void) { int i = 0,array[10],max,min; do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小値 %d\n",max,min); return 0; } void maxmin(int array[],int *max,int *min) { int i = 0; *max = 0; *min = 100; while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; } }

  • MT4のEAで時間決済の構文 MQLプログラミング

    時間軸で簡単なエントリーとクローズを考えていますが本に書いてありません。 どなたか構文わかる方いらっしゃいましたらお力貸して下さい。 売買時間(日本時間)7:05~7:40まで 7:05にbuyオーダーを実行する 7:40に上記ポジションを無条件で決済する 宜しくお願いします。