質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

1回答

1413閲覧

OrderCloseの記入場所

nisei2

総合スコア19

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2020/09/07 13:29

前提・実現したいこと

買いのポジションを所持中または買いの待機注文を所持している時に売りの条件がみたされたら買いのポジションと待機注文を一度決済したい。

発生している問題・エラーメッセージ

'OrderClose' - function declarations are allowed on global, namespace or class scope only

該当のソースコード

MQL4

1void OnTick() 2{ 3 //前日足の四本値 4 double H1 = iHigh(NULL,0,1); 5 double L1 = iLow(NULL,0,1); 6 double O1 = iOpen(NULL,0,1); 7 double C1 = iClose(NULL,0,1); 8 9 //最高値 10 int highestprice = iHighest(NULL,PERIOD_D1,MODE_HIGH,20,1); 11 12 //最高値の4本値 13 double highestH = iHigh(NULL,0,highestprice); 14 double highestL = iLow(NULL,0,highestprice); 15 double highestO = iOpen(NULL,0,highestprice); 16 double highestC = iClose(NULL,0,highestprice); 17 18 //最安値 19 int cheapestprice = iLowest(NULL,PERIOD_D1,MODE_LOW,20,1); 20 21 //最安値の4本値 22 double cheapestH = iHigh(NULL,0,cheapestprice); 23 double cheapestL = iLow(NULL,0,cheapestprice); 24 double cheapestO = iOpen(NULL,0,cheapestprice); 25 double cheapestC = iClose(NULL,0,cheapestprice); 26 27 //損切値制限 28 double buyson = cheapestH-cheapestL; 29 double sellson = highestH-highestL; 30 31 //週足の四本値 32 double WH1 = iHigh(NULL,PERIOD_W1,1); 33 double WL1 = iLow(NULL,PERIOD_W1,1); 34 double WO1 = iOpen(NULL,PERIOD_W1,1); 35 double WC1 = iClose(NULL,PERIOD_W1,1); 36 37 //前週足の四本値 38 double WH2 = iHigh(NULL,PERIOD_W1,2); 39 double WL2 = iLow(NULL,PERIOD_W1,2); 40 double WO2 = iOpen(NULL,PERIOD_W1,2); 41 double WC2 = iClose(NULL,PERIOD_W1,2); 42 43 //月足の四本値 44 double MNH1 = iHigh(NULL,PERIOD_MN1,1); 45 double MNL1 = iLow(NULL,PERIOD_MN1,1); 46 double MNO1 = iOpen(NULL,PERIOD_MN1,1); 47 double MNC1 = iClose(NULL,PERIOD_MN1,1); 48 49 //前月足の四本値 50 double MNH2 = iHigh(NULL,PERIOD_MN1,2); 51 double MNL2 = iLow(NULL,PERIOD_MN1,2); 52 double MNO2 = iOpen(NULL,PERIOD_MN1,2); 53 double MNC2 = iClose(NULL,PERIOD_MN1,2); 54 55 int ticketB = 0; 56 int ticketS = 0; 57 58//////////////////////////////////////////////////////////////////////////////////////////////////////////// 59if(highestL > C1 && ticketB > 1)//買いのポジションまたは買いの待機注文があるときに、売りの条件が発生したら決済 60{ 61bool OrderClose(ticketB,lots,C1,10,Red); 62bool OrderDelete(ticketB,Red); 63} 64 65if(cheapestH < C1 && ticketS > 1)//売りのポジションまたは売りの待機注文があるときに、売りの条件が発生したら決済 66{ 67bool OrderClose(ticketS,lots,C1,10,Red); 68bool OrderDelete(ticketS,Red); 69} 70 71if(ticketB <= 0 && ticketS<=0)//ポジションと待機注文がないなら 72{ 73 if(cheapestH < C1 && MarketInfo(NULL,MODE_SPREAD) < maxspread)//買いの条件・現在のスプレッド・スプレッド上限 74 { 75 ticketB = OrderSend(//買いの処理 76 Symbol(),//通貨ペア 77 OP_BUYLIMIT,//買いの指値 78 lots,//ロット数 79 cheapestH,//注文価格 80 10,//スリップページ 81 cheapestL,//損切 82 0,//利確 83 NULL,//コメント 84 1111,//マジックナンバー 85 closeperiod,//有効期限 86 Magenta//色 87 ); 88 } 89 90//////////////////////////////////////////////////////////////////////////////////////////////////////////// 91 if(highestL > C1 && MarketInfo(NULL,MODE_SPREAD) < maxspread)//売りの条件・現在のスプレッド・スプレッド上限 92 { 93 ticketS = OrderSend(//売りの処理 94 Symbol(),//通貨ペア 95 OP_SELLLIMIT,//売りの指値 96 lots,//ロット数 97 highestL,//注文価格 98 10,//スリップページ 99 highestH,//損切 100 0,//利確 101 NULL,//コメント 102 1111,//マジックナンバー 103 closeperiod,//有効期限 104 Magenta//色 105 ); 106 } 107} 108//////////////////////////////////////////////////////////////////////////////////////////////////////////// 109} 110

試したこと

グローバル、ネームスペース、またはクラススコープでのみ関数宣言が許可されます.
とエラーがでたのですが意味がよくわからず。
試したことはOnTickの外に決済のコードをだしてみたりしたのですが同じエラーがでました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MQL

1if(highestL > C1 && ticketB > 1)//買いのポジションまたは買いの待機注文があるときに、売りの条件が発生したら決済 2{ 3bool OrderClose(ticketB,lots,C1,10,Red); 4bool OrderDelete(ticketB,Red); 5} 6 7if(cheapestH < C1 && ticketS > 1)//売りのポジションまたは売りの待機注文があるときに、売りの条件が発生したら決済 8{ 9bool OrderClose(ticketS,lots,C1,10,Red); 10bool OrderDelete(ticketS,Red); 11}

boolがついているため、関数宣言と判定されてコンパイルエラーになっています。

動かしていないので参考までにですが、ポジションの決済の処理を書いてみました。
実際に動かす場合はOrderCloseのエラーチェック等も必要です。
あとは、この辺りのリファレンスを見ながらやってみるといいと思います。https://yukifx.web.fc2.com/sub/reference/16_trade_func/cone/trade_root.html

MQL

1void OnTick() 2{ 3 // ... 4 5 for (int i = OrdersTotal() - 1; i >= 0; i--) 6 { 7 // ポジション又は注文を選択 8 if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 9 { 10 continue; 11 } 12 if (OrderSymbol() != Symbol()) 13 { 14 continue; 15 } 16 if (OrderMagicNumber() != 1111) 17 { 18 continue; 19 } 20 21 int ticket = OrderTicket(); 22 int type = OrderType(); 23 24 if (highestL > C1) 25 { 26 printf("売りの条件発生 %f %f", highestL, C1); 27 28 if (type == OP_BUY) 29 { 30 printf("買いポジションクローズ"); 31 OrderClose(ticket, OrderLots(), Bid, 10, Red); 32 } 33 34 if (type == OP_BUYLIMIT) 35 { 36 printf("買い注文削除"); 37 OrderDelete(ticket, Red); 38 } 39 } 40 41 if (cheapestH < C1) 42 { 43 printf("買いの条件発生 %f %f", cheapestH, C1); 44 45 if (type == OP_SELL) 46 { 47 printf("売りポジションクローズ"); 48 OrderClose(ticket, OrderLots(), Ask, 10, Red); 49 } 50 51 if (type == OP_SELLLIMIT) 52 { 53 printf("売り注文削除"); 54 OrderDelete(ticket, Red); 55 } 56 } 57 } 58 59 if (OrdersTotal() == 0) // ポジション・注文がない場合 60 { 61 // ... 62 } 63}

投稿2020/09/07 22:10

編集2020/09/07 22:59
mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nisei2

2020/09/08 10:53

教えていただきありがとうございます。 ポジション決済の処理まで書いていただきとても助かりました! 勉強を始めたばかりでなかなか思っている処理をプログラムできなくて困ってたところです。 教えてもらったコードにエントリー条件を足して動かしてみたのですがずっと売り(買い)の条件発生の処理を繰り返しています。こういうものなのでしょうか。
mah

2020/09/08 11:25

売買の条件は元のソースに記述されていたものをとりあえず入れただけなので、 自分の考えた通りに動いているかは、printfやデバッガで確認する必要はあります。
nisei2

2020/09/08 12:07

ずっと売り(買い)の条件発生の処理を繰り返してしまい検証はできませんでしたが考えていただいた処理のコードを参考に勉強を続けます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問