忍者ブログ

forex tester2のインディケーターを自作

fx(外国為替証拠金取引)のトレードの練習やルールの検証をForex Tester 2というソフトでしてみます。 Meta Trader4(MT4)のインディケーター(indicator)をForex Tester2用に移植できたらしてみます。

カテゴリー:Sessions.mq4 をForex Tester2に移植

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


Sessions.mq4 をForexTester2用に移植成功

適当に作ってみました。

楽するために週を跨ぐ時に強制的にBOXを閉じるようにしています。
また7:00にBOX表示開始するようにしていて週の開始が8:00のときは
そのBOXは表示しません。


procedure Calculate(index: integer); stdcall; var timeindex: TDateTime; nowdaystr: string; nowday: Word; nowhour: word; begin if first = 0 then begin if AsiaEndTime <= AsiaBeginTime then AsiaEndTime := AsiaBeginTime + 1; first := 1; print(IntToStr(AsiaBeginTime) + ' ' + IntToStr(AsiaEndTime)); end; if (index <> 0) then exit; timeindex := Time(index); nowday := DayOf(timeindex); nowhour := HourOf(timeindex); nowdaystr := IntToStr(nowday); case modeA of 0: begin if nowhour = AsiaBeginTime then begin AsiaMax := High(index); AsiaMin := Low(index); AsiaObjectName := 'A' + nowdaystr; if not(ObjectExists(AsiaObjectName + 'u')) then begin ObjectCreate(AsiaObjectName + 'u', obj_TrendLine, 0, timeindex, 0, timeindex, 0); ObjectCreate(AsiaObjectName + 'd', obj_TrendLine, 0, timeindex, 0, timeindex, 0); ObjectCreate(AsiaObjectName + 'l', obj_TrendLine, 0, timeindex, 0, timeindex, 0); ObjectCreate(AsiaObjectName + 'r', obj_TrendLine, 0, timeindex, 0, timeindex, 0); ObjectSet(AsiaObjectName + 'u', OBJPROP_COLOR, AsiaColor); ObjectSet(AsiaObjectName + 'd', OBJPROP_COLOR, AsiaColor); ObjectSet(AsiaObjectName + 'l', OBJPROP_COLOR, AsiaColor); ObjectSet(AsiaObjectName + 'r', OBJPROP_COLOR, AsiaColor); ObjectSet(AsiaObjectName + 'u', OBJPROP_WIDTH, 3); ObjectSet(AsiaObjectName + 'd', OBJPROP_WIDTH, 3); ObjectSet(AsiaObjectName + 'l', OBJPROP_WIDTH, 3); ObjectSet(AsiaObjectName + 'r', OBJPROP_WIDTH, 3); end; ObjectSet(AsiaObjectName + 'l', OBJPROP_TIME1, timeindex); ObjectSet(AsiaObjectName + 'l', OBJPROP_PRICE1, AsiaMax); ObjectSet(AsiaObjectName + 'l', OBJPROP_TIME2, timeindex); ObjectSet(AsiaObjectName + 'l', OBJPROP_PRICE2, AsiaMin); ObjectSet(AsiaObjectName + 'u', OBJPROP_TIME1, timeindex); ObjectSet(AsiaObjectName + 'u', OBJPROP_PRICE1, AsiaMax); ObjectSet(AsiaObjectName + 'u', OBJPROP_TIME2, timeindex); ObjectSet(AsiaObjectName + 'u', OBJPROP_PRICE2, AsiaMax); ObjectSet(AsiaObjectName + 'd', OBJPROP_TIME1, timeindex); ObjectSet(AsiaObjectName + 'd', OBJPROP_PRICE1, AsiaMin); ObjectSet(AsiaObjectName + 'd', OBJPROP_TIME2, timeindex); ObjectSet(AsiaObjectName + 'd', OBJPROP_PRICE2, AsiaMin); if not(ObjectExists('Atu')) then begin ObjectCreate('Atu', obj_Text, 0, 0, 0); ObjectSet('Atu', OBJPROP_VALIGNMENT, tlBottom); ObjectSet('Atu', OBJPROP_HALIGNMENT, taRightJustify); ObjectCreate('Atd', obj_Text, 0, 0, 0); ObjectSet('Atd', OBJPROP_VALIGNMENT, tlTop); ObjectSet('Atd', OBJPROP_HALIGNMENT, taRightJustify); end; ObjectSet('Atu', OBJPROP_TIME1, timeindex); ObjectSet('Atu', OBJPROP_PRICE1, AsiaMax); ObjectSetText('Atu', FloatToStr(AsiaMax)); ObjectSet('Atd', OBJPROP_TIME1, timeindex); ObjectSet('Atd', OBJPROP_PRICE1, AsiaMin); ObjectSetText('Atd', FloatToStr(AsiaMin)); AsiaEndTime2 := IncHour(timeindex, AsiaEndTime - AsiaBeginTime); modeA := 1; end; end; 1: begin if AsiaMax < High(index) then begin AsiaMax := High(index); ObjectSet(AsiaObjectName + 'l', OBJPROP_PRICE1, AsiaMax); ObjectSet(AsiaObjectName + 'u', OBJPROP_PRICE1, AsiaMax); ObjectSet(AsiaObjectName + 'u', OBJPROP_PRICE2, AsiaMax); ObjectSet('Atu', OBJPROP_PRICE1, AsiaMax); ObjectSetText('Atu', FloatToStr(AsiaMax)); end; if AsiaMin > Low(index) then begin AsiaMin := Low(index); ObjectSet(AsiaObjectName + 'l', OBJPROP_PRICE2, AsiaMin); ObjectSet(AsiaObjectName + 'd', OBJPROP_PRICE1, AsiaMin); ObjectSet(AsiaObjectName + 'd', OBJPROP_PRICE2, AsiaMin); ObjectSet('Atd', OBJPROP_PRICE1, AsiaMin); ObjectSetText('Atd', FloatToStr(AsiaMin)); end; ObjectSet(AsiaObjectName + 'u', OBJPROP_TIME2, timeindex); ObjectSet(AsiaObjectName + 'd', OBJPROP_TIME2, timeindex); ObjectSet('Atu', OBJPROP_TIME1, timeindex); ObjectSet('Atd', OBJPROP_TIME1, timeindex); if timeindex >= AsiaEndTime2 then begin ObjectSet(AsiaObjectName + 'u', OBJPROP_TIME2, AsiaEndTime2); ObjectSet(AsiaObjectName + 'd', OBJPROP_TIME2, AsiaEndTime2); ObjectSet(AsiaObjectName + 'r', OBJPROP_TIME1, AsiaEndTime2); ObjectSet(AsiaObjectName + 'r', OBJPROP_PRICE1, AsiaMax); ObjectSet(AsiaObjectName + 'r', OBJPROP_TIME2, AsiaEndTime2); ObjectSet(AsiaObjectName + 'r', OBJPROP_PRICE2, AsiaMin); ObjectSet('Atu', OBJPROP_TIME1, AsiaEndTime2); ObjectSet('Atd', OBJPROP_TIME1, AsiaEndTime2); modeA := 0; end; end; end; end;


このインディケーターはAsia用ですがObject名の被らないものを作ってEuro、Ny用のインディケーターにしています。
1つのインディケーターにすることも可能でしょう。



こんな感じで表示します。枠内の塗りつぶしはできないと思われます。




同じ頃の本家の表示です。大体似通っています。 
 


動画もあります

PR

ちょっとはまったこと

オブジェクトの作成で少しはまりました。
Initの中でObjectを作成しているのに全く表示できませんでした。
Calculateの中の処理が悪いと思いいろいろ試しましたが無理でした。

そこで ObjectCreate の戻り値を確認してみたらInitでは失敗していました。

以下が確認用のコードです。


procedure Init; stdcall; begin IndicatorShortName('i-session'); SetOutputWindow(ow_ChartWindow); IndicatorBuffers(0); if not(ObjectExists('t1')) then begin print('create object t1 in Init'); if ObjectCreate('t1', obj_Text, 0, 0, 0) then print('ok') else print('ng'); ObjectSetText('t1', 'Init', 12, 'Arial', clYellow); end; end; procedure Done; stdcall; begin ObjectDelete('t1'); end; procedure Calculate(index: integer); stdcall; begin if (index <> 0) or (Bars < 80) then exit; print(IntToStr(Timeframe())); if not(ObjectExists('t1')) then begin print('create object t1 in Calc'); if ObjectCreate('t1', obj_Text, 0, 0, 0) then print('ok') else print('ng'); end; ObjectSetText('t1', FormatDateTime('YYYY/MM/DD HH:MM:SS',Time(0)), 12, 'Arial', clYellow); ObjectSet('t1', OBJPROP_TIME1, Time(0)); ObjectSet('t1', OBJPROP_PRICE1, High(0)); end;


Doneの中のObject削除処理は有効でした。
Calculateの中でObjectを作成する必要があるようです。






それともうひとつふたつ確認したことがあります。Timeframe()の戻り値はチャートに同期するかです。
結果はインディケーターを読み込んだ時の値(分)が返ります。
1H足表示中にインディケーターを追加したら
それ以外の時間のチャートにしても常に60を返します。


時間を変えて同じインディケーターを追加した場合は
後から追加したインディケーターのCalculateが後から実行されます。



forex tester2 販売
Forex Tester 2の購入はこちらから。
カレンダー
10 2024/11 12
S M T W T F S
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
カテゴリー
フリーエリア



最新記事
最新CM
最新TB
RSS
ブログ内検索
アーカイブ
最古記事
プロフィール
HN:
fx練習生
年齢:
49
性別:
男性
誕生日:
1975/04/03
職業:
夢は専業トレーダー
趣味:
fx
自己紹介:
fxの専業トレーダーになって経済的自由と時間的自由を手に入れたいです。
自分で売買ルールを作成してテストして自信をもってリアルトレードしたいです。
P R