Table of Contents
ステップバイステップで外枠を作って埋めてくと良さそう
一度にコードを生成するよりも一個一個出した方が精度が高まります。
プロンプト
以下の条件でMQL4を使ってMT4のEAを作成してください。
- MagicNumberは999959999
- 最初の関数を回答する場合は最初の行に#property strictをいれること
- 一個前のローソク足を使用する
- RSI > 70 でショート
- RSI < 30 でロング
- RSI < 40 でショート決済
- RSI > 60 でロング決済
- リミットストップはつけないこと
関数を作ったら区切ってステップバイステップで関数のコードを表示させてください。
- void position_entry(int side) をつくる
- void position_close(int side) をつくる
- int position_count(int side) をつくる
- テクニカル指標を計算して結果を返すbool is_buy()、bool is_sell()をつくる
- テクニカル指標を計算して結果を返すbool is_buy_close()、bool is_sell_close()をつくる
- 各関数を組み合わせてOnTick()をつくる
注意点として
- OnTick()内部で各関数を呼び出すこと
- position_countはMagicNumberを含めること
- 現在のポジション情報の取得にfor (int i = OrdersTotal() – 1; i >= 0; i–)を使うこと
- ポジション数は整数です
まずはvoid position_entry(int side)の関数を作ってください
これであとは「続けてください」を押すとコードを書いてくれます。
終わったら機能を追加していきます
フィルター機能を追加する
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#property strict void position_entry(int side) { double rsi = iRSI(_Symbol, _Period, 14, PRICE_CLOSE, 1); if (side == OP_BUY && rsi > 70) { int buy_ticket = OrderSend(_Symbol, OP_BUY, 0.01, Ask, 3, 0, 0, "Buy", 999959999, 0, Green); if (buy_ticket <= 0) { Print("OrderSend error: ", GetLastError()); } } else if (side == OP_SELL && rsi < 30) { int sell_ticket = OrderSend(_Symbol, OP_SELL, 0.01, Bid, 3, 0, 0, "Sell", 999959999, 0, Red); if (sell_ticket <= 0) { Print("OrderSend error: ", GetLastError()); } } } void position_close(int side) { double rsi = iRSI(_Symbol, _Period, 14, PRICE_CLOSE, 1); int cnt = position_count(side); for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == 999959999 && OrderSymbol() == _Symbol && OrderType() == side) { if (side == OP_BUY && rsi < 40) { OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red); } else if (side == OP_SELL && rsi > 60) { OrderClose(OrderTicket(), OrderLots(), Ask, 3, Green); } } } } } int position_count(int side) { int cnt = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() == 999959999 && OrderSymbol() == _Symbol && OrderType() == side) { cnt++; } } } return cnt; } bool is_buy(){ double mom100 = iMomentum(_Symbol, PERIOD_CURRENT, 100, PRICE_CLOSE, 0); double mom200 = iMomentum(_Symbol, PERIOD_CURRENT, 200, PRICE_CLOSE, 0); double rsi = iRSI(_Symbol, PERIOD_CURRENT, 14, PRICE_CLOSE, 0); if (rsi > 30 && mom100 < 0 && mom200 < 0) { return true; } else { return false; } } bool is_sell(){ double mom100 = iMomentum(_Symbol, PERIOD_CURRENT, 100, PRICE_CLOSE, 0); double mom200 = iMomentum(_Symbol, PERIOD_CURRENT, 200, PRICE_CLOSE, 0); double rsi = iRSI(_Symbol, PERIOD_CURRENT, 14, PRICE_CLOSE, 0); if (rsi < 70 && mom100 > 0 && mom200 > 0) { return true; } else { return false; } } bool is_buy_close() { double rsi = iRSI(_Symbol, _Period, 14, PRICE_CLOSE, 1); return (rsi > 60); } bool is_sell_close() { double rsi = iRSI(_Symbol, _Period, 14, PRICE_CLOSE, 1); return (rsi < 40); } void OnTick() { // ロングポジションのエントリー if (is_buy()) { if (position_count(OP_BUY) == 0) { OrderSend(_Symbol, OP_BUY, 0.1, Ask, 3, 0, 0, "Buy", 999959999, 0, Green); } } // ショートポジションのエントリー if (is_sell()) { if (position_count(OP_SELL) == 0) { OrderSend(_Symbol, OP_SELL, 0.1, Bid, 3, 0, 0, "Sell", 999959999, 0, Red); } } // ポジションのクローズ position_close(OP_BUY); position_close(OP_SELL); } |
サンプルコードのバックテスト結果
おわり
ステップを踏むと調子が良くなります。
回答はガチャに近いのでハズレとアタリが半分半分ですね。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…