作成したウェーブレットエネルギー分析のインジケータをex4形式で公開します。
ただし、このインジケータ、ものすごく重いので、チャートのバー数を20000程度にしてご利用ください。私のPCだとバー数50000で15秒ほど表示にかかります。それ以上にすると固まります。ご注意ください。
それぞれのラインが下記の単純移動平均が持つエネルギー量を表しています。
黄色 32
緑色 64
青色 128
紫色 256
黄色は常に一定レベルのエネルギーを振幅させて持っていますが、緑→青→紫とエネルギーが移動していって紫がピークアウトすると流れが変わる様子がうかがえます。
ただし、ウェーブレットエネルギーは過去のチャートに対する分析では有効ですが、現在値を判定するのにはあまり有効ではありません。(実際やってみたけど、反応が遅すぎる上に波形の解析が難しい・・・)
ただし、トレンドが出ていない状態は、黄色のエネルギーが大きくなっていきますので、そのあたりでトレンドの有無判定には使えるかもしれません。
これを元にチャートの特性を分析して、戦略を考える足しにしてもらえればと思います。
眺めていると何かがつかめそうでつかめないインジケータです。何か活用のアイデアがあれば、ぜひ教えてください。
ダウンロードはこちらの一覧から
2015年6月26日金曜日
昨日はこてんぱんにされました。EAが苦手な急速な値動き Gewinn2
Gewinn2の弱点でもある浅目の損切が昨日は、裏目に出ました。
・・・・。まぁこーいうときもあるよねといった感じですが、Gewinn2はレンジブレイクを基本として動作しますので、短い期間でレンジブレイクを繰り返されると往復ビンタを食らう場合があります。
ギリシャ問題が問題となりつつある期間はみんなが不安になるのでGewinn2が得意な期間ですが、いざ解決に向けてタイムリミットとなると要人の発言一つで大きく揺れ動きます。
このような事が想定される場合は、素直にEAを停止していただいた方が良いです。
こーいうときはなるべく取引しない様、アルゴリズムの改善に努めます。
しかし、タイミングが悪くフォワードがかなり傷ついちゃったなぁ・・。悲しい・・。
2015年6月25日木曜日
今週のGewinn2
先週金曜日~今までのGewinn2です。
基本的に2回負けて1回勝つをベースにアルゴリズムが組まれていますので、予定通り2回負けて1回勝つを繰り返しています。
6/22は大きく取り戻しました。
今日の朝、Buyでポジションを取りましたが、いったん下がったところを見てクローズ。現在もう一回Buyポジションを取り直した状態です。
基本的に、リミットを大きくしてポジションを持つようにすれば、負け回数は減らすことができますが、一回の負けが大きくなります。今回は自分ではできない損切をEAにしてもらう事を目標にしているため、さくっと損切してもう一回いけそうなら取るという形で実装されていますね。
先週は負け続けましたが、今週は取り戻しつつあります。この調子で+まで戻して本来の動きになってほしいですねー。
あと、やっとこさOANDAプロ口座の手続きが完了しました。明日よりリアルマネー運用開始予定です。
2015年6月24日水曜日
MT4インジケータ 各国の取引時間を表示する。
特定区間を識別するプログラムのデバッグついでに実装しました。
日本時間、EU時間(フランクフルト-ロンドン)、NY時間を矩形で表示します。
世の中にたくさん同じようなよいインジケータが無料でたくさんありますので、インジケータの使用が目的の場合はそちらをご使用された方が良いかと思います。
たとえば、こちらFX-ONさんに掲載されている、「アジア・欧州・NYの時間帯をチャートに表示、Sessions EX」無料で素晴らしいインジケータだと思います
三つ巴のストップ狩り合戦に乗っかって、大きな動きを取る!
ただ、ちょいちょいっと修正すれば、いろんな期間で比較できますので、プログラムを触る事ができるというのは重要だと思い組んでみました。EAに組み込もうと思うと時間の判定とか重要ですもんね。
今まで作った時間関係の集大成的なコードになっています。
夏時間などの判定も含めて表示できるようにしました。
時間ごとの特徴が取引において重要な要素ということはまちがいなさそうです。こうやって四角形で並んでみていると、何となく特徴がつかめてくるような来ないような・・・。
やっぱり東京→EUでなんか出来そうなんですけどねー。実際には長期的なパターンを見つけ出すのは難しい・・・。短期ならいけるのですが。あと週末。1週間大きく動いた後の金曜日は結構な確率でポジション調整が入っているように思われます。ただしトレード機会がほとんどないのが難点です・・。
追記・・・チャート挿入直後に描画されない不具合がありますね・・。とりあえず、表示足を切り替えてもらえれば復帰します・・。なんでだろう?
日本時間、EU時間(フランクフルト-ロンドン)、NY時間を矩形で表示します。
世の中にたくさん同じようなよいインジケータが無料でたくさんありますので、インジケータの使用が目的の場合はそちらをご使用された方が良いかと思います。
たとえば、こちらFX-ONさんに掲載されている、「アジア・欧州・NYの時間帯をチャートに表示、Sessions EX」無料で素晴らしいインジケータだと思います
三つ巴のストップ狩り合戦に乗っかって、大きな動きを取る!
ただ、ちょいちょいっと修正すれば、いろんな期間で比較できますので、プログラムを触る事ができるというのは重要だと思い組んでみました。EAに組み込もうと思うと時間の判定とか重要ですもんね。
今まで作った時間関係の集大成的なコードになっています。
夏時間などの判定も含めて表示できるようにしました。
時間ごとの特徴が取引において重要な要素ということはまちがいなさそうです。こうやって四角形で並んでみていると、何となく特徴がつかめてくるような来ないような・・・。
やっぱり東京→EUでなんか出来そうなんですけどねー。実際には長期的なパターンを見つけ出すのは難しい・・・。短期ならいけるのですが。あと週末。1週間大きく動いた後の金曜日は結構な確率でポジション調整が入っているように思われます。ただしトレード機会がほとんどないのが難点です・・。
追記・・・チャート挿入直後に描画されない不具合がありますね・・。とりあえず、表示足を切り替えてもらえれば復帰します・・。なんでだろう?
//------------------------------------------------------------------ // 時間帯別レンジ表示 #property copyright "Copyright 2015, Daisuke" #property link "http://mt4program.blogspot.jp/" #property version "1.10" #property strict #property indicator_chart_window // 1時間 #define ONEHOUR (60*60) // GMTと東アメリカ標準時間の差(-5時間) #define GMT_TO_AMERICA (-18000) // オブジェクト名 #define OBJECT_NAME_RANGE "OBJ_TIMERANGE" // GMTオフセットが有効かどうか input int GMTOffset = 2; // サマータイムによる補正が必要かどうか input bool IsSummerTime = true; // 矩形の色 日本 input color JapanColor = C'0x11, 0x11, 0xbb'; // 矩形の色 Eu input color EuColor = C'0x40,0x40,0x0'; // 矩形の色 アメリカ input color AmericaColor = C'0xaa, 0x0, 0x0'; //------------------------------------------------------------------ //初期化 int OnInit() { string short_name = "TR"; IndicatorShortName(short_name); return(INIT_SUCCEEDED); } //------------------------------------------------------------------ //終了処理 void OnDeinit( const int reason ) { //オブジェクトを作成する。 long chartId = ChartID(); int total = ObjectsTotal( chartId ); //生成したオブジェクトを削除する。 //0から削除するとインデックス位置がずれて //正しく削除できないため、後ろから削除するようにする。 for( int i = total - 1; i >= 0 ; i--) { string name = ObjectName( chartId, i ); // 先頭文字列がRangeRectangleNameと一致する場合、削除する。 if ( StringFind( name, OBJECT_NAME_RANGE ) == 0 ) { ObjectDelete( chartId, name ); } } } //------------------------------------------------------------------ //計算イベント int OnCalculate( const int rates_total //各レート要素数 ,const int prev_calculated //計算済み要素数 ,const datetime &time[] //要素ごとの時間配列 ,const double &open[] //オープン価格配列 ,const double &high[] //高値配列 ,const double &low[] //安値配列 ,const double &close[] //クローズ価格配列 ,const long &tick_volume[] //ティック数(要素の更新回数) ,const long &volume[] //実ボリューム(?) ,const int &spread[]) //スプレット { if( Period() > PERIOD_H1 ) return rates_total; int i = 0; while( !IsStopped() && i < ( rates_total - prev_calculated ) ) { bool includeTime = false; // GMTを計算 int offset = GMTOffset * ONEHOUR; if( IsSummerTime && IsAmericaSummerTime(time[i]) ) { offset += ONEHOUR; } datetime gmt = time[i] - offset; // 日本時間の矩形を描画する。 // 日本時間 datetime japan = gmt + 9 * ONEHOUR; MqlDateTime current ; TimeToStruct(japan, current); MqlDateTime startStruct ; startStruct.year = current.year; startStruct.mon = current.mon; startStruct.day = current.day; startStruct.hour = 9; startStruct.min = 0; startStruct.sec = 0; datetime start = StructToTime(startStruct); MqlDateTime endStruct ; endStruct.year = current.year; endStruct.mon = current.mon; endStruct.day = current.day; endStruct.hour = 15; endStruct.min = 0; endStruct.sec = 0; datetime end = StructToTime(endStruct); if( start <= japan && japan < end ) { datetime chartStart = start + offset - 9 * ONEHOUR; datetime chartEnd = end + offset - 9 * ONEHOUR; FourValue result = GetFourValue(Symbol(), PERIOD_M30, chartStart, chartEnd); if( result.close != 0 && result.open != 0 ) { string name = GetObjectName("JP", japan); CreateRectangleObject(name, chartStart, chartEnd, result.high, result.low, JapanColor); } while( i < rates_total && time[i] >= chartStart ) i++; includeTime = true; } // フランクフルト~ロンドン時間を描画する。 int summerTimeOffset = 0 ; if( IsEnglandSummerTime(gmt) ) { summerTimeOffset = ONEHOUR; } datetime eu = gmt + summerTimeOffset; TimeToStruct(eu, current); startStruct.year = current.year; startStruct.mon = current.mon; startStruct.day = current.day; startStruct.hour = 7; startStruct.min = 0; startStruct.sec = 0; start = StructToTime(startStruct); endStruct.year = current.year; endStruct.mon = current.mon; endStruct.day = current.day; endStruct.hour = 16; endStruct.min = 30; endStruct.sec = 0; end = StructToTime(endStruct); if( start <= eu && eu < end ) { datetime chartStart = start + offset - summerTimeOffset; datetime chartEnd = end + offset - summerTimeOffset; FourValue result = GetFourValue(Symbol(), PERIOD_M30, chartStart, chartEnd); if( result.close != 0 && result.open != 0 ) { string name = GetObjectName("EU", eu); CreateRectangleObject(name, chartStart, chartEnd, result.high, result.low, EuColor); } while( i < rates_total && time[i] >= chartStart ) i++; includeTime = true; } // アメリカ時間を描画する。 summerTimeOffset = 0 ; if( IsAmericaSummerTime(gmt) ) { summerTimeOffset = ONEHOUR; } datetime america = gmt + summerTimeOffset - 5 * ONEHOUR; TimeToStruct(america, current); startStruct.year = current.year; startStruct.mon = current.mon; startStruct.day = current.day; startStruct.hour = 9; startStruct.min = 0; startStruct.sec = 0; start = StructToTime(startStruct); endStruct.year = current.year; endStruct.mon = current.mon; endStruct.day = current.day; endStruct.hour = 16; endStruct.min = 00; endStruct.sec = 0; end = StructToTime(endStruct); if( start <= america && america < end ) { datetime chartStart = start + offset + 5 * ONEHOUR - summerTimeOffset; datetime chartEnd = end + offset + 5 * ONEHOUR - summerTimeOffset; FourValue result = GetFourValue(Symbol(), PERIOD_M30, chartStart, chartEnd); if( result.close != 0 && result.open != 0 ) { string name = GetObjectName("NY", eu); CreateRectangleObject(name, chartStart, chartEnd, result.high, result.low, AmericaColor); } while( i < rates_total && time[i] >= chartStart ) i++; includeTime = true; } if( !includeTime ) i++; } return(rates_total - 1); } //------------------------------------------------------------------ //オブジェクト名を生成する。 string GetObjectName( string prefix, datetime localTime ) { MqlDateTime current ; TimeToStruct(localTime, current); MqlDateTime start ; start.year = current.year; start.mon = current.mon; start.day = current.day; start.hour = 0; start.min = 0; start.sec = 0; return OBJECT_NAME_RANGE + prefix + TimeToString( StructToTime( start ) ); } //------------------------------------------------------------------ //矩形を生成する。 // 生成成功時 True bool CreateRectangleObject ( string name , datetime startTime // 開始時間 , datetime endTime // 終了時間 , double top // 上限価格 , double bottom // 下限価格 , color backColor // 背景色 ) { //オブジェクトを作成する。 long chartId = ChartID(); int index = ObjectFind( chartId, name ); if( index < 0 ) { if ( ObjectCreate( chartId, name, OBJ_RECTANGLE, 0, startTime, top, endTime, bottom ) == false ) { return false; } } else { ObjectSetInteger( chartId, name, OBJPROP_TIME1, startTime); ObjectSetInteger( chartId, name, OBJPROP_TIME2, endTime); ObjectSetDouble( chartId, name, OBJPROP_PRICE1, top); ObjectSetDouble( chartId, name, OBJPROP_PRICE2, bottom); } ObjectSetInteger( chartId, name, OBJPROP_COLOR, backColor ); return true; } //------------------------------------------------------------------ // サマータイム指定日時がサマータイムかどうか // return 指定GMT時間がサマータイムの場合 true bool IsAmericaSummerTime( datetime gmt // GMT ) { datetime americaTime = gmt + GMT_TO_AMERICA; MqlDateTime dt; TimeToStruct(americaTime, dt); //夏時間判定 datetime startSummerTime; datetime endSummerTime; MqlDateTime work; int week; if( dt.year < 2007 ) { // 標準時ベースで4月第1日曜日 AM2:00 ~ 10月最終日曜日AM1:00 work.year = dt.year; work.mon = 4; work.day = 1; work.hour = 2; work.min = 0 ; work.sec = 0 ; week = TimeDayOfWeek(StructToTime(work)); if( week != SUNDAY ) work.day = work.day + 7 - week; startSummerTime = StructToTime(work) ; work.mon = 10; work.day = EndOfMonth(work.year, work.mon); work.hour = 2; work.min = 0; work.sec = 0 ; week = TimeDayOfWeek(StructToTime(work)); work.day = work.day - week; endSummerTime = StructToTime(work) ; } else { // 標準時ベースで3月第2日曜日 AM2:00 ~ 11月第1日曜日AM1:00 work.year = dt.year; work.mon = 3; work.day = 8; work.hour = 2; work.min = 0 ; work.sec = 0 ; week = TimeDayOfWeek(StructToTime(work)); if( week != SUNDAY ) work.day = work.day + 7 - week; startSummerTime = StructToTime(work) ; work.mon = 11; work.day = 1; work.hour = 2; work.min = 0 ; work.sec = 0 ; week = TimeDayOfWeek(StructToTime(work)); if( week != SUNDAY ) work.day = work.day + 7 - week; endSummerTime = StructToTime(work) ; } return startSummerTime <= americaTime && americaTime < endSummerTime ; } //------------------------------------------------------------------ // 指定日時がEUサマータイムかどうか // return 指定GMT時間がサマータイムの場合 true bool IsEnglandSummerTime( datetime gmt // GMT ) { datetime londonTime = gmt; MqlDateTime dt; TimeToStruct(londonTime, dt); //夏時間判定 datetime startSummerTime; datetime endSummerTime; MqlDateTime work; int week; // 標準時ベースで3月最終日曜日 AM1:00 ~ 10月最終日曜日AM1:00 work.year = dt.year; work.mon = 3; work.day = EndOfMonth(work.year, work.mon);; work.hour = 1; work.min = 0 ; work.sec = 0 ; week = TimeDayOfWeek(StructToTime(work)); work.day = work.day - week; startSummerTime = StructToTime(work) ; work.mon = 10; work.day = EndOfMonth(work.year, work.mon); work.hour = 1; work.min = 0 ; work.sec = 0 ; week = TimeDayOfWeek(StructToTime(work)); work.day = work.day - week; endSummerTime = StructToTime(work) ; return startSummerTime <= londonTime && londonTime < endSummerTime; } //------------------------------------------------------------------ //指定月の最終日を返す int EndOfMonth( int year, // 年 int month // 月 ) { MqlDateTime work; work.year = year; work.mon = month + 1; work.day = 1; work.hour = 0; work.min = 0 ; work.sec = 0 ; if( work.mon >= 13) { work.mon = 1; work.year = work.year + 1; } return TimeDay( StructToTime(work) - 1 ); } // 4本値構造体 struct FourValue { // オープン double open; // クローズ double close; // 高値 double high; // 安値 double low; }; //------------------------------------------------------------------ //指定期間の4本値を返す。 FourValue GetFourValue( string symbol // 対象の通貨ペア , ENUM_TIMEFRAMES timeframe // 分解能 , datetime startTime // 開始時間(開始時間は含む) , datetime endTime // 終了時間(終了時間は含まない) ) { FourValue result; result.open = 0; result.close = 0; result.high = 0; result.low = 0; datetime lastTime = iTime( symbol, timeframe, 0); int i = 0 ; if( lastTime > endTime ) { i = iBarShift( symbol, timeframe, endTime - PeriodSeconds(timeframe), true) ; if( i < 0 ) { // 値が取れない場合は0 return result ; } } i--; if( i < 0 ) i = 0 ; double close = 0 ; double open = 0 ; double low = iClose(symbol, timeframe, 0 ) * 1000; double high = 0; while( !IsStopped() ) { datetime current = iTime(symbol, timeframe, i); if( current <= 0 ) break ; if( startTime <= current && current < endTime ) { if( close == 0 ) close = iClose( symbol, timeframe, i); open = iOpen( symbol, timeframe, i); double currentHigh = iHigh(symbol, timeframe, i); double currentLow = iLow(symbol, timeframe, i); if( low > currentLow ) low = currentLow; if( high < currentHigh ) high = currentHigh; } if( current < startTime ) break ; i++; } result.open = open; result.close = close; result.high = high; result.low = low; return result; }
2015年6月23日火曜日
MT4プログラムの小ネタ スクリプトを使って動作確認する。
関数だと、一回だけ実行してくれるような形でテストしたほうが確認がしやすい事があります。
MT4では、スクリプトという形で、一回実行するプログラムをサポートしています。
メタエディタを開き、Scriptsフォルダを選択して、右クリック→新規ファイルを選択します。
ウィザードでは、スクリプトを選択した後、名前の欄に作成するスクリプトの名前を入力して完了ボタンを押すと空のファイルが作成されます。
作成されるファイルはOnStartだけある単純なファイルです。OnStartが一回だけ呼び出されて終了します。
今回は、指定時間の4本値を取得する関数が正しく動作するかどうかを確認するプログラムを書きました。とりあえずサンプルなので、単純に1時間足の値と、5分足で計算した1時間の値を比較して値が一致するかどうかを確認するプログラムです。とりあえず、値は一致しました。基本的なロジックは問題が無いようです。
テストとしては、これで不十分で、最低でも境界値チェックは必要かと思います。
逆コツコツドカン型EA Gewinn2 販売中
初期導入者様向け先着10名様に9800円でご提供します!
不明な点、動作が分からない点ありましたら、ご質問ください!
EURUSDがギリシャ問題に揺れて少し狭い範囲を急速に行ったり来たりしているためGewinn2君も戦績が良くありません。ギリシャネタもいったん大詰めでしょうから、そろそろ次の動きがありそうです。スイングトレードタイプですと、ポジションを保有して評価損を抱えた状態で動きを待ちますが、Gewinn2は諦めて損切して次の動きを待ちます。さて次の動きはどうなるでしょうか?
MT4では、スクリプトという形で、一回実行するプログラムをサポートしています。
メタエディタを開き、Scriptsフォルダを選択して、右クリック→新規ファイルを選択します。
ウィザードでは、スクリプトを選択した後、名前の欄に作成するスクリプトの名前を入力して完了ボタンを押すと空のファイルが作成されます。
//+------------------------------------------------------------------+ //| FourValueTest.mq4 | //| Copyright 2015, Daisuke | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Daisuke" #property link "http://mt4program.blogspot.jp/" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- }
作成されるファイルはOnStartだけある単純なファイルです。OnStartが一回だけ呼び出されて終了します。
今回は、指定時間の4本値を取得する関数が正しく動作するかどうかを確認するプログラムを書きました。とりあえずサンプルなので、単純に1時間足の値と、5分足で計算した1時間の値を比較して値が一致するかどうかを確認するプログラムです。とりあえず、値は一致しました。基本的なロジックは問題が無いようです。
テストとしては、これで不十分で、最低でも境界値チェックは必要かと思います。
// 一時間(秒) #define ONEHOUR (3600) //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int handle = FileOpen("FourValueTest.csv", FILE_CSV|FILE_WRITE, ',', CP_ACP); datetime start = D'2015.06.01 12:00:00'; datetime end = D'2015.06.01 13:00:00'; FourValue result = GetFourValue("EURUSD", PERIOD_M5, start, end); FileWrite(handle, "GetFourValue", start, end, result.open, result.close, result.high, result.low ); int shift = iBarShift( "EURUSD", PERIOD_H1, start, true) ; FileWrite(handle, "H1", start, "" , iOpen("EURUSD", PERIOD_H1, shift) , iClose("EURUSD", PERIOD_H1, shift) , iHigh("EURUSD", PERIOD_H1, shift) , iLow("EURUSD", PERIOD_H1, shift)); FileClose(handle); } //+------------------------------------------------------------------+ // 4本値構造体 struct FourValue { // オープン double open; // クローズ double close; // 高値 double high; // 安値 double low; }; //------------------------------------------------------------------ //指定期間の4本値を返す。 FourValue GetFourValue( string symbol // 対象の通貨ペア , ENUM_TIMEFRAMES timeframe // 分解能 , datetime startTime // 開始時間(開始時間は含む) , datetime endTime // 終了時間(終了時間は含まない) ) { FourValue result; result.open = 0; result.close = 0; result.high = 0; result.low = 0; int i = iBarShift( symbol, timeframe, endTime, true) ; if( i < 0 ) { // 値が取れない場合は0 return result ; } i--; if( i < 0 ) i = 0 ; double close = 0 ; double open = 0 ; double low = iClose(symbol, timeframe, 0 ) * 1000; double high = 0; while( !IsStopped() ) { datetime current = iTime(symbol, timeframe, i); if( current <= 0 ) break ; if( startTime <= current && current < endTime ) { if( close == 0 ) close = iClose( symbol, timeframe, i); open = iOpen( symbol, timeframe, i); double currentHigh = iHigh(symbol, timeframe, i); double currentLow = iLow(symbol, timeframe, i); if( low > currentLow ) low = currentLow; if( high < currentHigh ) high = currentHigh; } if( current < startTime ) break ; i++; } result.open = open; result.close = close; result.high = high; result.low = low; return result; }
逆コツコツドカン型EA Gewinn2 販売中
初期導入者様向け先着10名様に9800円でご提供します!
不明な点、動作が分からない点ありましたら、ご質問ください!
EURUSDがギリシャ問題に揺れて少し狭い範囲を急速に行ったり来たりしているためGewinn2君も戦績が良くありません。ギリシャネタもいったん大詰めでしょうから、そろそろ次の動きがありそうです。スイングトレードタイプですと、ポジションを保有して評価損を抱えた状態で動きを待ちますが、Gewinn2は諦めて損切して次の動きを待ちます。さて次の動きはどうなるでしょうか?
2015年6月22日月曜日
MT4プログラムの小ネタ。指定期間の高値安値を取得する(未検証w)
うあー。慶事と不幸が重なって、先週末から超大忙しです。とりあえず、FXのことは横に置いておいて慌ただしい時間をすごしました。
ということで、小ネタです。
指定時間の高値安値をとる関数です。ビルドを通った段階です。さて、このプログラム正しく動作するのでしょうか?このようなのを確認するのにMT4にはスクリプトという単発実行の機能があります。明日、デバッグがてらにスクリプトで実行してみます。
逆コツコツドカン型EA Gewinn2 販売中
初期導入者様向け先着10名様に9800円でご提供します!
不明な点、動作が分からない点ありましたら、ご質問ください!
まぁ直近コツコツ負けてますよね。こーいう段階で売れるとは思っていない為、しばらくは放置。取り戻したときに宣伝しよっと(笑)
うーん、もう少し勝率の高いロジックを作って合わせて運用するようにしないと負け分ばかり目につくなー。(汗)
ということで、小ネタです。
指定時間の高値安値をとる関数です。ビルドを通った段階です。さて、このプログラム正しく動作するのでしょうか?このようなのを確認するのにMT4にはスクリプトという単発実行の機能があります。明日、デバッグがてらにスクリプトで実行してみます。
// 4本値構造体 struct FourValue { // オープン double open; // クローズ double close; // 高値 double high; // 安値 double low; }; //------------------------------------------------------------------ //指定期間の4本値を返す。 FourValue GetFourValue( string symbol // 対象の通貨ペア , datetime startTime // 開始時間(開始時間は含む) , datetime endTime // 終了時間(終了時間は含まない) , ENUM_TIMEFRAMES period // 分解能 ) { datetime now = iTime(symbol, period, 0 ); int i = 0 ; int diff = (int)(now - endTime); if( diff < 0 ) diff = 0; int week = diff / (7 * ONEHOUR * 24) + 1; int periodSecond = PeriodSeconds(period); // 探査開始位置を、差分から計算する。 // 一週間超えている場合は、休みの分を除く。 i = diff / periodSecond - week * ONEHOUR * 24 * 2 / periodSecond; if( i < 0 ) i = 0 ; double close = 0 ; double open = 0 ; double low = iClose(symbol, period, 0 ) * 1000; double high = 0; while( !IsStopped() ) { datetime current = iTime(symbol, period, i); if( current <= 0 ) break ; if( startTime <= current && current < endTime ) { if( close == 0 ) close = iClose( symbol, period, i); open = iOpen( symbol, period, i); double currentHigh = iHigh(symbol, period, i); double currentLow = iLow(symbol, period, i); if( low > currentLow ) low = currentLow; if( high < currentHigh ) high = currentHigh; } if( current < startTime ) break ; i++; } FourValue result; result.open = open; result.close = close; result.high = high; result.low = low; return result; }
逆コツコツドカン型EA Gewinn2 販売中
初期導入者様向け先着10名様に9800円でご提供します!
不明な点、動作が分からない点ありましたら、ご質問ください!
まぁ直近コツコツ負けてますよね。こーいう段階で売れるとは思っていない為、しばらくは放置。取り戻したときに宣伝しよっと(笑)
うーん、もう少し勝率の高いロジックを作って合わせて運用するようにしないと負け分ばかり目につくなー。(汗)
登録:
投稿 (Atom)