ゴトー日を運用を始めたくてEAを作ってみました。
わりと簡単に作れました😀
初心者むけです。
Table of Contents
ゴゴジャンで自作EAの販売に挑戦中
この記事のロジックそのまま、オリジナル機能もりもりで魔改造してEA販売しています。
EA作れるようになったら色々出来て楽しいね😁
ゴゴジャンというEAのプラットフォームをつかってます。
みんなもゆくゆくはEAの販売・配布に挑戦してみてくださいね!
ロット0.01固定お試し版を配布してます。バックテストも可能です。
MT4で自動売買EA(エキスパートアドバイザー)を自作する
毎度ですが先にゴールを決めてから作りはじめます。
今回のゴールは、「ドル円ゴトー日EAを完成」です。
MT4のEAの作り方は、
日本時間の2時にドル円をロング、9時55分に決済。
日本時間の9時55分にドル円をショート、15時に決済。
・エントリー
・決済
の2個のルールが必要です。
ネットでググるとほとんど情報がでてくるので、きっと作れます。
自動化させるロジックを確認
先にTradingViewでロジックを確認します。
ロングエントリールールは2時00分~9時54分に滞在、決済ルールは9時55分に到達。
ショートエントリールールは9時55分~14時59分に滞在、決済ルールは15時00分に到達。
Gotobi Teriyaki by hosono_p on TradingView.com
コードは以下のリンクから確認できます。
ブログの存続のため、TradingViewの有料アカウントを申し込むときは以下の紹介リンクから申し込みをお願いします。
MT4のインストール
仮想通貨の自動売買をしたいのでMT4はエクスネスのデモ口座を利用します。
エクスネスのMT4デモ口座の申請方法
お疲れ様でした。これでMT4の準備完了です。次はプログラミング用のエディタを表示させます。
MT4のプログラミングエディタ(メタエディタ)を起動
MQLのプログラムのコードはここに書いていきます。
エキスパートアドバイザーの新規作成
新規でEAを作ります。
テンプレコードの説明
いちおうテンプレの説明しておきます。飛ばしてもOKです。※MAゴールデンクロスの転用です。
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 |
//+------------------------------------------------------------------+ //| MAゴールデンクロス.mq4 | //| Copyright 2022, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ |
上から9行目まではEAの説明文など
1 2 3 4 5 6 7 8 9 |
//+------------------------------------------------------------------+ //| MAゴールデンクロス.mq4 | //| Copyright 2022, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict |
最後の property strict で日本語化されます。
他はEAの説明文に転載されます。
// ダブルスラッシュから始まるのはコメントアウトです。
int OnInit()はEA起動時に呼ばれる機能です。
1 2 3 4 5 6 7 8 9 10 |
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } |
int OnDeinit()はEA削除時に呼ばれる機能です。
1 2 3 4 5 6 7 8 |
//+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } |
void OnTick()は値動きがあった時に呼ばれる機能です。
1 2 3 4 5 6 7 8 9 |
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ |
テンプレには3つの機能がデフォルト搭載されている
・EAを開いたとき
・EAを終了させたとき
・値動き時
今回は値動き時のときだけプログラムのコードを実行させるので値動きだけでOK
OnTick関数は値動きがあったら呼ばれる機能です。
例えばBTCUSDの最小単位0.01が動けば実行されます。
20000.00→20000.01
ちなみにMT4では最小単位をPointと呼びます。
void 何も返さない
実行したときに呼び出し元に何も返さない。
対義としては何かを返す関数。
voidの他に、何かを返す関数はint,double,boolが使われる。
何も返さない場合は void を関数の先頭につける。
OnTickはMT4が実行させているので返却しなくてもいい。
TimeLocal()でPCの現在の日本時間を取得する
MT4はパソコンの時間とズレて表示されているのでMT4の時刻を参照してゴトー日を計算するとズレます。
市販のEAは、夏時間冬時間を計算してEAに組み込むのですが、今回は簡単に作りたいので、Windowsの現在時刻を取得して時間判別に使います。
使う関数は、
TimeLocal()
です。
TimeLocal()の動作を確認します。
Print()
Print()でエキスパートのログに出力させることができます。
値動き毎にPrint(TimeLocal()); でパソコンの現在の時間がdatetime型の形でプリントアウトされています。
datetime型とは?
datetimeは日付です。またはintの属性をもっています。
なので、int(整数型)にすると1970年1月1日からの経過時間秒で表示させることもできます。
int timeに代入してみると、
TimeLocal()の結果を int time 変数に代入しています。
1970年1月1日からの経過秒
5のつく日、10のつく日を計算する
現在の時間から日付を取得して5のつく日10のつく日を計算します。
「MQL ゴトー日」でネット検索すると参考コードがでてきますので参考にしてTimeLocal()版に書き換えていきます。
1 2 3 |
bool is_gotobi() { return false; } |
まずは関数を作成します。
現在のパソコンの時間を変数に保存します。
datetime pc_time = TimeLocal();
日付を取得するTimeDay()関数を使います。今日の日付を int day に代入します
int day = TimeDay(pc_time);
余りを計算するMathMod()関数を使います。日付÷5の余りの数をdouble amari に代入します
double amari = MathMod(day,5);
amariの数が0の場合は5の倍数の日付、つまりゴトー日です。
1 2 3 |
if(amari==0) { return true; } |
is_gotobi()関数の動作確認します。
1 2 3 |
void OnTick() { Print(is_gotobi()); } |
土日が5のつく日、10のつく日の場合は金曜日に繰り下げられるのでその計算を組み込みます。
曜日を計算するTimeDayOfWeek()で今日の曜日をint youbi に代入します
int youbi = TimeDayOfWeek(pc_time);
金曜日かつamariが3(3のつく日)かamariが4(4のつく日)ならゴトー日です。
1 2 3 4 5 6 |
if(youbi==FRIDAY && amari==3) { return true; } if(youbi==FRIDAY && amari==4) { return true; } |
ゴトー日の判別関数が完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
bool is_gotobi() { datetime pc_time = TimeLocal(); int day = TimeDay(pc_time); double amari = MathMod(day,5); if(amari==0) { return true; } int youbi = TimeDayOfWeek(pc_time); if(youbi==FRIDAY && amari==3) { return true; } if(youbi==FRIDAY && amari==4) { return true; } return false; } |
次は現在の時間を計算する
ゴトー日の2時から9時54分まではBUY判定
日付を計算するのと似たような関数なので説明は割愛します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
bool is_buy_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); for(int i=2; i < 9; i++) { if(hour == i) { return true; } } if(hour==9 && minute <= 54) { return true; } return false; } |
ゴトー日の9時55分から14時59分まではSELL判定
日付を計算するのと似たような関数なので説明は割愛します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
bool is_sell_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); if(hour == 9 && 55 <= minute) { return true; } for(int i=10; i < 15; i++) { if(hour == i) { return true; } } return false; } |
月曜日から金曜日までを判定
TradingViewで先に作ったら間違って土曜日の2時からロングされちゃったので、MT4でもしっかりと平日判定をいれます。
平日ならtrue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
bool is_weekday() { datetime pc_time = TimeLocal(); int youbi = TimeDayOfWeek(pc_time); if(youbi==MONDAY) { return true; } if(youbi==TUESDAY) { return true; } if(youbi==WEDNESDAY) { return true; } if(youbi==THURSDAY) { return true; } if(youbi==FRIDAY) { return true; } return false; } |
BUY条件トリガーでロングエントリーさせる
BUY条件は、
1.ゴトー日
2.2時から9時54分に滞在
3.平日
なので、プログラミングコードで翻訳すると、
if(is_gotobi() && is_buy_time() && is_weekday()){}
になります。
ポジション数が0の場合という条件をつける
ロングポジションを持っている条件を加えないと無限ループで買い続けてしまうのでポジション数が0の場合だけエントリーします。
「ポジション数 mql」でネット検索すると参考コードが見つかります。
ロングポジション数の取得関数を作成
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int buy_posi_count() { int count = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY ) { if(OrderSymbol()==Symbol()) { count++; } } } return count; } |
条件式は
buy_posi_count() == 0
です。
MagicNumber(マジックナンバー)をつけてEAでのポジションを識別させる
EAのポジションとほかでエントリーしたポジションを判別できるようにマジックナンバーをつけます。
定数(変数)でmagic_numberを宣言しておきます。
関数の外側を外部スコープと呼びます。
関数に属していないのをグローバルスコープと呼びます。
int magic_number = 510;
は関数に属していない、グローバルスコープの変数です。
グローバルスコープにおいてあると処理で変更をしない限りデータは変更されません。
保存しておきたい数字はグローバルスコープへ置くと保存されます。
また、関数に属している変数のことをローカルスコープの変数と呼びます。
ローカルスコープの変数はOnTickが実行されるとデータはリセットされます。
ポジション数の取得関数をMagicNumberを追加して修正
ポジション取得に識別するマジックナンバーを加えます。
変更前
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int buy_posi_count() { int count = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY ) { if(OrderSymbol()==Symbol()) { count++; } } } return count; } |
変更後
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int buy_posi_count() { int count = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==magic_number) { count++; } } } } return count; } |
BUY条件達成かつポジション数が0ならエントリー
1.ゴトー日
2.2時から9時54分に滞在
3.平日
4.ロングポジション数が0
1 2 3 |
if(is_gotobi() && is_buy_time() && is_weekday() && buy_posi_count()==0) { OrderSend(Symbol(),0,0.5,Ask,10,0,0,"",0,0,clrGreen); } |
スプレッド拡大していたら損をするので対策する
スプが広がる可能性もあるのでスプレッド拡大防止のためのコードを追加します。
スプレッドはAsk-Bidで計算できます。
1.ゴトー日
2.2時から9時54分に滞在
3.平日
4.ロングポジション数が0
5.スプレッドが0.25以内
1 2 3 4 5 |
if(is_gotobi() && is_buy_time() && is_weekday() && buy_posi_count()==0) { if((Ask - Bid) < 0.25) { OrderSend(Symbol(),0,0.5,Ask,10,0,0,"",0,0,clrGreen); } } |
以上でエントリーのプログラミングは完成です。
次は決済つくります。
決済ルールを計算する
決済は時間外のときです。
1 |
is_buy_time() |
is_buy_timeで判定しているので、
is_buy_time() == false
なら決済になります。
is_buy_time() == falseは
!is_buy_time()とも表現できるので、
1 |
!is_buy_time() |
あとはポジション数が0ではないなら決済します。
1 |
buy_posi_count()!=0 |
決済判定式
1 |
if(!is_buy_time() && buy_posi_count()!=0){} |
決済関数をつくる
決済させるには
ポジションを識別→決済
させる必要があるので、決済の関数をべつでつくります。
使いやすいように引数追加してBUY決済とSELL決済ができるようにしておきます。
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 |
void position_close(string side) { if(side=="buy_close") { for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==magic_number) { OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrBlue); } } } } } if(side=="sell_close") { for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_SELL) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==magic_number) { OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrBlue); } } } } } } |
引き渡すデータを引数と呼びます。
(string side) が引数です。
今回は引数を1個渡しています。
引数は呼ぶときに呼び出し元で記述します。
position_close(“buy_close”); ならBUYポジションを決済します。
position_close(“sell_close”); ならSELLポジションを決済します。
条件で決済させる
時間外かつロングポジションを持っているなら決済します。
1.時間外
2.EAのポジション数が0ではない
3.スプレッドが0.25以内
1 2 3 4 5 |
if(!is_buy_time() && buy_posi_count()!=0) { if((Ask - Bid) < 0.25) { position_close("buy_close"); } } |
これで決済も完成です。
EAが完成!
コード全文
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
#property strict int magic_number = 510; void OnTick() { if(is_gotobi() && is_buy_time() && is_weekday() && buy_posi_count()==0) { if((Ask - Bid) < 0.25) { OrderSend(Symbol(),0,0.1,Ask,10,0,0,"",magic_number,0,clrGreen); } } if(!is_buy_time() && buy_posi_count()!=0) { if((Ask - Bid) < 0.25) { position_close("buy_close"); } } if(is_gotobi() && is_sell_time() && is_weekday() && sell_posi_count()==0) { if((Ask - Bid) < 0.25) { OrderSend(Symbol(),1,0.1,Bid,10,0,0,"",magic_number,0,clrRed); } } if(!is_sell_time() && sell_posi_count()!=0) { if((Ask - Bid) < 0.25) { position_close("sell_close"); } } } bool is_gotobi() { datetime pc_time = TimeLocal(); int day = TimeDay(pc_time); double amari = MathMod(day,5); if(amari==0) { return true; } int youbi = TimeDayOfWeek(pc_time); if(youbi==FRIDAY && amari==3) { return true; } if(youbi==FRIDAY && amari==4) { return true; } return false; } bool is_buy_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); for(int i=2; i < 9; i++) { if(hour == i) { return true; } } if(hour==9 && minute <= 54) { return true; } return false; } bool is_sell_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); if(hour == 9 && 55 <= minute) { return true; } for(int i=10; i < 15; i++) { if(hour == i) { return true; } } return false; } bool is_weekday() { datetime pc_time = TimeLocal(); int youbi = TimeDayOfWeek(pc_time); if(youbi==MONDAY) { return true; } if(youbi==TUESDAY) { return true; } if(youbi==WEDNESDAY) { return true; } if(youbi==THURSDAY) { return true; } if(youbi==FRIDAY) { return true; } return false; } int buy_posi_count() { int count = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==magic_number) { count++; } } } } return count; } int sell_posi_count() { int count = 0; for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_SELL) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==magic_number) { count++; } } } } return count; } void position_close(string side) { if(side=="buy_close") { for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==magic_number) { OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrBlue); } } } } } if(side=="sell_close") { for(int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_SELL) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==magic_number) { OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrBlue); } } } } } } |
あとは
この表示がでる。
これで完成です。
バックテストは出来ない
Windowsの時刻をつかうので、バックテストは出来ないです。
代わりにTradingViewでのバックテストをのせておきます。
ロングエントリールールは2時00分~9時54分に滞在、決済ルールは9時55分に到達。
ショートエントリールールは9時55分~14時59分に滞在、決済ルールは15時00分に到達。
Gotobi Teriyaki by hosono_p on TradingView.com
コードは以下のリンクから確認できます。
ブログの存続のため、TradingViewの有料アカウントを申し込むときは以下の紹介リンクから申し込みをお願いします。
ロット0.01固定お試し版を配布してます。バックテストも可能です。
実際に稼働させる
これでおわりです。
MT4のEAが完成!
お疲れ様でした。
全部がおわりです。
ゴトー日のEAは勝てるEAだと思っているので実運用しています。
内容でわからないことはコメントに書き込みしてください。
まとめとおさらい
エントリーと決済ルールが必要。
・無料
・デモ口座が使える
・情報が豊富にある
・MT4の操作に癖があるので慣れるまでちょっとめんどくさい
このブログは広告で運営費を捻出しています。
なので広告収入がないとそのうち消滅します。
なので紹介リンクから口座開設よろしくお願いします。
Amazonで何か買い物をしたい場合は以下のリンクからお買い物してください。
夏はビールがうまい!
FXのEAを作ってみるのもありかも。
質問と回答
is_buy_time()を変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
bool is_buy_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); for(int i=2; i < 9; i++) { if(hour == i) { return true; } } if(hour==9 && minute <= 54) { return true; } return false; } |
このコードの説明を省いていたので、改めて説明します。
for文の中の、
翻訳すると
「2から始まり、9未満」の数字が繰り返し入ります。
i=2,
i=3,
i=4,
i=5,
i=6,
i=7,
i=8
その下の条件分岐は
1 |
if(hour == i) |
hourはPCの現在時刻の時間を取得していますので、
i は「2~8」
hour は「現在のPCの時間の時間の単位」
なので現在時刻が
7時30分なら、
hourは「7」です。
1 |
if(7 == 7) //true |
ということで、時間を変更する場合は、
int i=2; i < 9を変更してください。
この部分に以下の文を追加します。
1 2 3 |
#property strict int magic_number = 510; |
input double lots = 0.1;
1 2 3 4 5 |
#property strict int magic_number = 510; input double lots = 0.1; |
そのあと、オーダーコマンドを改変します。
変更前
変更後
参考サイト
エントリ―、決済時間についてですが、例えばBUYポジションを3時30分から10時までの間に保持、ということであれば、
bool is_buy_time() {
datetime pc_time = TimeLocal();
int hour = TimeHour(pc_time);
int minute = TimeMinute(pc_time);
if(hour == 3 && 30 <= minute) {
return true;
}
for(int i=4; i < 10; i++) {
if(hour == i) {
return true;
}
}
return false;
これで良いと思うのですが、これを9時55分まで、としたい場合(つまり、3時30分から9時50分まで)としたい場合には、どのように記述すべきなのか答えが見つからず悩んでおります。
同様にショートも10時エントリー、14時半決済であれば
bool is_sell_time() {
datetime pc_time = TimeLocal();
int hour = TimeHour(pc_time);
int minute = TimeMinute(pc_time);
for(int i=10; i < 14; i++) {
if(hour == i) {
return true;
}
}
if(hour==14 && minute <= 30) {
return true;
}
return false;
}
で良いと思うのですが、10時05分~14:30、という設定をする場合の記載も、うまく設定ができません。
アドバイスいただければ幸いです。
※後ほど、お礼にビール送らせていただきます!
「return true;」 に注目してみるといいかもしれません。
関数の波かっこ{ }の中でのみ使えるのが
return true;
です。
おそらくこれがあやふやになっているから、記載方法がわからなくなったのではと思いましたのので、まずは return true;について説明します。
return true;は日本語で翻訳すると、
「真で戻る」 です。
もっと詳細に説明すると、
is_buy_time() を呼び出すと、 「真または、偽」 が返却(return)されます。
真または、偽とは、プログラミングでしか使わない日本語です。
一般的には「bool」を正誤や○×と思っていただいて大丈夫です。
is_buy_time() の文の先頭に「bool」(真偽値)とつけています。
bool is_buy_time()
これを日本語で翻訳すると、
「正誤を返却する装置」 です。
なので bool is_buy_time()の役目は、BUYエントリー時間なら ”正” を返却することです。
そして、大事なのが、
返却した時点で役目が完了します。
これを踏まえて、
変更前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
bool is_buy_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); if(hour == 3 && 30 <= minute) { return true; //この時点で関数の処理が終了する。そして、trueを返却する。 } for(int i=4; i < 10; i++) { if(hour == i) { return true;//この時点で関数の処理が終了する。そして、trueを返却する。 } } return false;//この時点で関数の処理が終了する。そして、falseを返却する。 } |
変更後(3時30分から9時54分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
bool is_buy_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); //3時30分から3時59分はtrue; if(hour == 3 && 30 <= minute) { return true; //この時点で関数の処理が終了する。そして、trueを返却する。 } //4時から8時はtrue; for(int i=4; i < 9; i++) { if(hour == i) { return true;//この時点で関数の処理が終了する。そして、trueを返却する。 } } //追加 //9時00分から9時54分はtrue; if(hour == 9 && minute < 55) { return true; //この時点で関数の処理が終了する。そして、trueを返却する。 } return false;//この時点で関数の処理が終了する。そして、falseを返却する。 } |
ショートの部分(10:05~14:30という設定)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
bool is_sell_time() { datetime pc_time = TimeLocal(); int hour = TimeHour(pc_time); int minute = TimeMinute(pc_time); //10時05分から10時59分 if(hour==10 && 5 <= minute) { return true;//この時点で関数の処理が終了する。そして、trueを返却する。 } //11時00から13時59分 for(int i=11; i < 14; i++) { if(hour == i) { return true;//この時点で関数の処理が終了する。そして、trueを返却する。 } } //14時00分から14時30分 if(hour==14 && minute <= 30) { return true;//この時点で関数の処理が終了する。そして、trueを返却する。 } return false;//この時点で関数の処理が終了する。そして、falseを返却する。 } |
return は自由に追加ができます。
ちなみにvoid場合は、 return;と書けばその時点で処理が終了して、何もデータを返却しません。
こちらで説明は大丈夫でしょうか?
ご厚意いただきありがとうございます😀
ほしいものリストです。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…