懸案 | 仕様 |
エントリー基準 |
○短期単純移動平均と長期単純移動平均がクロスした時にエントリーする
○逆にクロスしたらクローズする。 ○短期SMA期間は5日、長期SMAは25日で固定 |
トレードスタイル | ○順張りのみ |
リミット・ストップ |
○リミットは20%に設定
○ストップは10%に設定 ○エントリー直後に入れる必要は無い ○トレーリングストップはしない |
判定タイミング |
○エントリー・クローズ判定はローソク足確定時に行う
○リミット・ストップは指定時間経過毎に行う |
建玉と増玉 |
○増玉はしない
○ロットは最小ロット固定 |
//+------------------------------------------------------------------+ //| OnInit(初期化)イベント //+------------------------------------------------------------------+ int OnInit() { if ( IsDemo() == false ) { // デモ口座以外の場合 Print("デモ口座でのみ動作します"); return INIT_FAILED; // 処理終了 } return( INIT_SUCCEEDED ); // 戻り値:初期化成功 }
//+------------------------------------------------------------------+ //| ローソク足確定時の処理 //+------------------------------------------------------------------+ void TaskPeriod() { static datetime s_lasttime; // 最後に記録した時間軸時間 // staticはこの関数が終了してもデータは保持される datetime temptime = iTime( Symbol(), Period() ,0 ); // 現在の時間軸の時間取得 if ( temptime == s_lasttime ) { // 時間に変化が無い場合 return; // 処理終了 } s_lasttime = temptime; // 最後に記録した時間軸時間を保存 // ----- 処理はこれ以降に追加 ----------- printf( "[%d]ローソク足確定%s" , __LINE__ , TimeToStr( Time[0] ) ); }
//+------------------------------------------------------------------+ //| 指定時間足確定時の処理 //+------------------------------------------------------------------+ void TaskSetMinPeriod() { static datetime s_lastset_mintime; // 最後に記録した時間軸時間 // staticはこの関数が終了してもデータは保持される datetime temptime = iTime( Symbol(), PERIOD_M30 ,0 ); // 現在の時間軸の時間取得 if ( temptime == s_lastset_mintime ) { // 時間に変化が無い場合 return; // 処理終了 } s_lastset_mintime = temptime; // 最後に記録した時間軸時間を保存 // ----- 処理はこれ以降に追加 ----------- printf( "[%d]指定時間足確定%s" , __LINE__ , TimeToStr( Time[0] ) ); }
//+------------------------------------------------------------------+ //| tick受信イベント //| EA専用のイベント関数 //+------------------------------------------------------------------+ void OnTick() { TaskPeriod(); // ローソク足確定時の処理 TaskSetMinPeriod(); // 指定時間足確定時の処理 } //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //| テスト用オブジェクト描画 //+------------------------------------------------------------------+ void TestDispObject( int in_index ) { // インデックスが範囲外の場合は描画しない if ( in_index < 0 ) { return; } if ( in_index >= Bars ) { return; } string obj_name; // オブジェクト名 obj_name = StringFormat( "%sEATest%s" , OBJ_HEAD, TimeToStr( Time[in_index] ) ); if ( ObjectFind( obj_name ) >= 0 ) { // オブジェクト名重複チェック // 重複している場合 ObjectDelete( obj_name ); // 指定したオブジェクトを削除する } ObjectCreate( // オブジェクト生成 obj_name, // オブジェクト名 OBJ_ARROW_RIGHT_PRICE, // オブジェクトタイプ 0, // ウインドウインデックス Time[in_index] , // 1番目の時間のアンカーポイント Close[in_index] // 1番目の価格のアンカーポイント ); // オブジェクトプロパティ設定 ObjectSetInteger( 0, obj_name, OBJPROP_COLOR, clrYellow); // ラインの色設定 ObjectSetInteger( 0, obj_name, OBJPROP_WIDTH, 1); // ラインの幅設定 ObjectSetInteger( 0 ,obj_name, OBJPROP_BACK, false); // オブジェクトの背景表示設定 ObjectSetInteger( 0 ,obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定 ObjectSetInteger( 0 ,obj_name, OBJPROP_SELECTED, false); // オブジェクトの選択状態 ObjectSetInteger( 0 ,obj_name, OBJPROP_HIDDEN, true); // オブジェクトリスト表示設定 }
// マクロ定義 #define OBJ_HEAD ( __FILE__ + "_" ) // オブジェクトヘッダ名 //+------------------------------------------------------------------+ //| OnDeinit(アンロード)イベント //+------------------------------------------------------------------+ void OnDeinit( const int reason ) { if ( IsTesting() == false ) { // バックテスト時以外 ObjectsDeleteAll( // 追加したオブジェクトを全削除 0, // チャートID OBJ_HEAD // オブジェクト名の接頭辞 ); } }
懸案 | 仕様 |
エントリー基準 |
○短期単純移動平均と長期単純移動平均がクロスした時にエントリーする
○逆にクロスしたらクローズする。 ○短期SMA期間は5日、長期SMAは25日で固定 |
トレードスタイル | ○順張りのみ |
判定タイミング |
○エントリー判定はローソク足確定時に行う
○クローズ判定はローソク足確定時に行う |
//+------------------------------------------------------------------+ //| 移動平均線のクロス判定 //+------------------------------------------------------------------+ bool MACrossJudge(){ bool ret = false; double base_short_ma_rate; // 確定した短期移動平均 double base_middle_ma_rate; // 確定した長期移動平均 // 確定した短期SMAを取得 base_short_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 5, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 1 // シフト ); // 確定した長期SMAを取得 base_middle_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 25, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 1 // シフト ); // 短期SMAが長期SMAを上抜け if ( base_short_ma_rate > base_middle_ma_rate ) { ret = true; } if ( ret == true ) { TestDispObject(1); // テスト用オブジェクトを描画 } return ret; }
//+------------------------------------------------------------------+ //| 移動平均線のクロス判定 //+------------------------------------------------------------------+ bool MACrossJudge(){ bool ret = false; double base_short_ma_rate; // 確定した短期移動平均 double base_middle_ma_rate; // 確定した長期移動平均 double last_short_ma_rate; // 前回の短期移動平均 double last_middle_ma_rate; // 前回の長期移動平均 // 確定した短期SMAを取得 base_short_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 5, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 1 // シフト ); // 確定した長期SMAを取得 base_middle_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 25, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 1 // シフト ); // 前回の短期SMAを取得 last_short_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 5, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 2 // シフト ); // 前回の長期SMAを取得 last_middle_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 25, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 2 // シフト ); // 短期SMAが長期SMAを上抜け if ( base_short_ma_rate > base_middle_ma_rate && last_short_ma_rate < last_middle_ma_rate ) { ret = true; } if ( ret == true ) { TestDispObject(1); // テスト用オブジェクトを描画 } return ret; }
// enum列挙型宣言 enum ENUM_MA_CROSS { // 移動平均クロス列挙 MAC_NO = 0, // 無し MAC_UP_CHANGE, // MA上抜け MAC_DOWN_CHANGE // MA下抜け };
//+------------------------------------------------------------------+ //| 移動平均線のクロス判定 //+------------------------------------------------------------------+ ENUM_MA_CROSS MACrossJudge(){ ENUM_MA_CROSS ret = MAC_NO; //~中略~ // 短期SMAが長期SMAを上抜け if ( base_short_ma_rate > base_middle_ma_rate && last_short_ma_rate < last_middle_ma_rate ) { ret = MAC_UP_CHANGE; } else if ( base_short_ma_rate < base_middle_ma_rate && last_short_ma_rate > last_middle_ma_rate ) { // 短期SMAが長期SMAを下抜け ret = MAC_DOWN_CHANGE; } if ( ret == MAC_UP_CHANGE || ret == MAC_DOWN_CHANGE ) { TestDispObject(1); // テスト用オブジェクトを描画 } return ret; }
2020.11.05 00:23, 104.5040000000008, 104.50356 2020.11.05 00:22, 104.5038000000008, 104.50348 2020.11.05 00:21, 104.5032000000008, 104.50316 2020.11.05 00:20, 104.5028000000008, 104.5026 2020.11.05 00:19, 104.5036000000008, 104.50244 2020.11.05 00:18, 104.5042000000008, 104.5022399999999 2020.11.05 00:17, 104.5046000000008, 104.5020799999999 2020.11.05 00:16, 104.5054000000008, 104.5017999999999 2020.11.05 00:15, 104.5054000000008, 104.5015999999999 2020.11.05 00:14, 104.5046000000008, 104.5010399999999 2020.11.05 00:13, 104.5042000000008, 104.5004799999999 2020.11.05 00:12, 104.5054000000008, 104.4997599999999 2020.11.05 00:11, 104.5100000000008, 104.4991599999999 2020.11.05 00:10, 104.5106000000008, 104.4987999999999 2020.11.05 00:08, 104.5116000000008, 104.4986799999999
//+------------------------------------------------------------------+ //| 移動平均線のクロス判定 //+------------------------------------------------------------------+ ENUM_MA_CROSS MACrossJudge(){ ENUM_MA_CROSS ret = MAC_NO; //~中略~ // 短期SMAが長期SMAを上抜け if ( base_short_ma_rate > base_middle_ma_rate && last_short_ma_rate <= last_middle_ma_rate ) { ret = MAC_UP_CHANGE; } else if ( base_short_ma_rate < base_middle_ma_rate && last_short_ma_rate >= last_middle_ma_rate ) { // 短期SMAが長期SMAを下抜け ret = MAC_DOWN_CHANGE; } if ( ret == MAC_UP_CHANGE || ret == MAC_DOWN_CHANGE ) { TestDispObject(1); // テスト用オブジェクトを描画 } return ret; }
懸案 | 仕様 |
エントリー基準 |
◎短期単純移動平均と長期単純移動平均がクロスした時にエントリーする
○逆にクロスしたらクローズする。 ●短期SMA期間は5日、長期SMAは25日で固定 |
トレードスタイル | ○順張りのみ |
リミット・ストップ |
○リミットは20%に設定
○ストップは10%に設定 ○エントリー直後に入れる必要は無い ○トレーリングストップはしない |
判定タイミング |
◎エントリー判定はローソク足確定時に行う
○クローズ判定はローソク足確定時に行う ○リミット・ストップは指定時間経過毎に行う(30分毎) |
建玉と増玉 |
○増玉はしない
○ロットは最小ロット固定 |
// if ( ret == MAC_UP_CHANGE || ret == MAC_DOWN_CHANGE ) {
// TestDispObject(1); // テスト用オブジェクトを描画
// }
//+------------------------------------------------------------------+ //| TestMACross.mq4 | //| yuki | //| https://yukifx.web.fc2.com/ | //+------------------------------------------------------------------+ #property copyright "yuki" #property link "https://yukifx.web.fc2.com/" #property version "1.00" #property strict // strictは絶対に削除しない事 // マクロ定義 #define OBJ_HEAD ( __FILE__ + "_" ) // オブジェクトヘッダ名 // enum列挙型宣言 enum ENUM_MA_CROSS { // 移動平均クロス列挙 MAC_NO = 0, // 無し MAC_UP_CHANGE, // MA上抜け MAC_DOWN_CHANGE // MA下抜け }; //+------------------------------------------------------------------+ //| OnInit(初期化)イベント //+------------------------------------------------------------------+ int OnInit() { if ( IsDemo() == false ) { // デモ口座以外の場合 Print("デモ口座でのみ動作します"); return INIT_FAILED; // 処理終了 } return( INIT_SUCCEEDED ); // 戻り値:初期化成功 } //+------------------------------------------------------------------+ //| OnDeinit(アンロード)イベント //+------------------------------------------------------------------+ void OnDeinit( const int reason ) { if ( IsTesting() == false ) { // バックテスト時以外 ObjectsDeleteAll( // 追加したオブジェクトを全削除 0, // チャートID OBJ_HEAD // オブジェクト名の接頭辞 ); } } //+------------------------------------------------------------------+ //| tick受信イベント //| EA専用のイベント関数 //+------------------------------------------------------------------+ void OnTick() { TaskPeriod(); // ローソク足確定時の処理 TaskSetMinPeriod(); // 指定時間足確定時の処理 } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ローソク足確定時の処理 //+------------------------------------------------------------------+ void TaskPeriod() { static datetime s_lasttime; // 最後に記録した時間軸時間 // staticはこの関数が終了してもデータは保持される datetime temptime = iTime( Symbol(), Period() ,0 ); // 現在の時間軸の時間取得 if ( temptime == s_lasttime ) { // 時間に変化が無い場合 return; // 処理終了 } s_lasttime = temptime; // 最後に記録した時間軸時間を保存 // ----- 処理はこれ以降に追加 ----------- MACrossJudge(); // 移動平均線のクロス判定 // printf( "[%d]ローソク足確定%s" , __LINE__ , TimeToStr( Time[0] ) ); } //+------------------------------------------------------------------+ //| 指定時間足確定時の処理 //+------------------------------------------------------------------+ void TaskSetMinPeriod() { static datetime s_lastset_mintime; // 最後に記録した時間軸時間 // staticはこの関数が終了してもデータは保持される datetime temptime = iTime( Symbol(), PERIOD_M30 ,0 ); // 現在の時間軸の時間取得 if ( temptime == s_lastset_mintime ) { // 時間に変化が無い場合 return; // 処理終了 } s_lastset_mintime = temptime; // 最後に記録した時間軸時間を保存 // ----- 処理はこれ以降に追加 ----------- // printf( "[%d]指定時間足確定%s" , __LINE__ , TimeToStr( Time[0] ) ); } //+------------------------------------------------------------------+ //| テスト用オブジェクト描画 //+------------------------------------------------------------------+ void TestDispObject( int in_index ) { // インデックスが範囲外の場合は描画しない if ( in_index < 0 ) { return; } if ( in_index >= Bars ) { return; } string obj_name; // オブジェクト名 obj_name = StringFormat( "%sEATest%s" , OBJ_HEAD, TimeToStr( Time[in_index] ) ); if ( ObjectFind( obj_name ) >= 0 ) { // オブジェクト名重複チェック // 重複している場合 ObjectDelete( obj_name ); // 指定したオブジェクトを削除する } ObjectCreate( // オブジェクト生成 obj_name, // オブジェクト名 OBJ_ARROW_RIGHT_PRICE, // オブジェクトタイプ 0, // ウインドウインデックス Time[in_index] , // 1番目の時間のアンカーポイント Close[in_index] // 1番目の価格のアンカーポイント ); // オブジェクトプロパティ設定 ObjectSetInteger( 0, obj_name, OBJPROP_COLOR, clrYellow); // ラインの色設定 ObjectSetInteger( 0, obj_name, OBJPROP_WIDTH, 1); // ラインの幅設定 ObjectSetInteger( 0 ,obj_name, OBJPROP_BACK, false); // オブジェクトの背景表示設定 ObjectSetInteger( 0 ,obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定 ObjectSetInteger( 0 ,obj_name, OBJPROP_SELECTED, false); // オブジェクトの選択状態 ObjectSetInteger( 0 ,obj_name, OBJPROP_HIDDEN, true); // オブジェクトリスト表示設定 } //+------------------------------------------------------------------+ //| 移動平均線のクロス判定 //+------------------------------------------------------------------+ ENUM_MA_CROSS MACrossJudge(){ ENUM_MA_CROSS ret = MAC_NO; double base_short_ma_rate; // 確定した短期移動平均 double base_middle_ma_rate; // 確定した長期移動平均 double last_short_ma_rate; // 前回の短期移動平均 double last_middle_ma_rate; // 前回の長期移動平均 // 確定した短期SMAを取得 base_short_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 5, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 1 // シフト ); // 確定した長期SMAを取得 base_middle_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 25, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 1 // シフト ); // 前回の短期SMAを取得 last_short_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 5, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 2 // シフト ); // 前回の長期SMAを取得 last_middle_ma_rate = iMA ( // 移動平均算出 Symbol(), // 通貨ペア Period(), // 時間軸 25, // MAの平均期間 0, // MAシフト MODE_SMA, // MAの平均化メソッド PRICE_CLOSE, // 適用価格 2 // シフト ); // 短期SMAが長期SMAを上抜け if ( base_short_ma_rate > base_middle_ma_rate && last_short_ma_rate <= last_middle_ma_rate ) { ret = MAC_UP_CHANGE; } else if ( base_short_ma_rate < base_middle_ma_rate && last_short_ma_rate >= last_middle_ma_rate ) { // 短期SMAが長期SMAを下抜け ret = MAC_DOWN_CHANGE; } // if ( ret == MAC_UP_CHANGE || ret == MAC_DOWN_CHANGE ) { // TestDispObject(1); // テスト用オブジェクトを描画 // } return ret; }