Forextester6におけるEAの作成(2)

昨日はさぼってしまったので反省。

気を取り直して作成していく。

 

EAにて毎Tickごとに注文することができたが、次はローソク足が新しく

作られた時に注文しようと思う。

 

ローソク足はBars関数にて数量を管理している。

Bars関数にて取得した値を適当な変数(仮barnum)に格納して、

Bars() > barnum の条件を付けてあげれば、

ローソク足が更新されたタイミングで注文できるのでは?

 

Bars関数にて取得しようとしたが、Barsの戻り値はずっと'0'だったので

ローソク足の本数はBarsで返せないらしい。

 

インジケータ作成時はBars関数にて全ローソク足の本数を返せていたが、

EA作成時は、Bars関数はなぜか返せなかった。

下記ソースコードにて検証

 

〇インジケータ作成時

 Print(IntToStr(Bars));

   →こっちはちゃんとバーの本数を返せてる

〇EA作成時

 Print(IntToStr(Bars));

   →'0' 固定

 

しょうがないのでiBars関数にて本数を読み込むことにした。

 

ローソク足ができたタイミングでの注文

緑線はEAをスタートさせたタイミング。

見ずらいかもしれないがローソク足が10本新しく形成されてる。

オープンポジションも10になっているのでちゃんと動作してそう。

 

ここで注意することはタイムフレームを変えてしまうと、ローソク足の数が

変わってしまうので自分で作った注文条件が成立していたら再度注文or

タイムフレーム変更前のローソク足の本数を超えない限り注文されない。

 

対処方法としてはチャートのタイムフレームを取得して、変更されたら

再度ローソク足の本数をチェックし直せばいいのでは?

→チャートのタイムフレームを変更して、Timeframe関数で戻り値を

 調べたら表示されているタイムフレームを返すんじゃなくて

 SetCurrencyAndTimeframe関数にて渡した引数を戻すだけだったので

 無理そう。

 

 

Forextester6におけるEAの作成(2)

EAにて毎Tickごとに注文することができたが、次はローソク足が新しく

作られた時に注文しようと思う。

 

ローソク足はBars関数にて数量を管理している。

Bars関数にて取得した値を適当な変数(仮barnum)に格納して、

Bars() > barnum の条件を付けてあげれば、

ローソク足が更新されたタイミングで注文できるのでは?

 

Bars関数にて取得しようとしたが、Barsの戻り値はずっと'0'だったので

ローソク足の本数はBarsで返せないらしい。

 

インジケータ作成時はBars関数にて全ローソク足の本数を返せていたが、

EA作成時は、Bars関数はなぜか返せなかった。

下記ソースコードにて検証

 

〇インジケータ作成時

 Print(IntToStr(Bars));

   →こっちはちゃんとバーの本数を返せてる

Print(IntToStr(Bars));

   →

ここで注意することはタイムフレームを変えてしまうと、ローソク足の数が

変わってしまうので自分で作った注文条件が成立していたら再度注文しに

行く可能性がある。

 

 

Forextester6におけるEAの作成(1)

EAを作っていくにあたって各手続き(procedure)、関数についてメモ書きしていく。

 

〇procedure InitStrategy; stdcall;

 ライブラリーを読み込むときに一回だけ呼び出しされる。

 

〇procedure Deinitialization; stdcall;

 EAを削除したときに一回だけ呼び出しされる。

 これってどのようなときに使えばいいんだろう?

 EAを終了したときとかに注文していたら強制決済させるとかかな

 

〇procedure ResetStrategy; stdcall;

 FTにてテスト開始ボタンを押したら呼び出される。

 これも何に使うんだろうか謎。

 

〇Procedure GetSingleTick; stdcall;

 Tickが更新されるたびに呼び出される。

 基本的にはここに処理を記述する。

 インジケータを作るときのprocedure Calculate(index); stdcall;と

 同じ役割かな

 

テストプログラムを走らせたとき

エラーに"変数実パラメータと変数仮パラメータとは同一の型で

     なければなりません"

と表示された。

 

ReplaceStr(Currency, 'USDJPY')

の一文があるが最初の宣言にて

Currency: Pchar = nil;

としてしまうとPWidecharとして認識してしまう為、

Currency: PAnsiChar = nil;

と変更してあげればエラーを回避できた。

Forextester6におけるインジケータの作成(3)

条件に合った時のみバンドを表示することができてマジでうれしいかもしれん。

バンドはライン表示したら、始点と終点が繋がって描写されるため、表示したくない範囲は直線を描いてしまって見づらかったのでシンボルで代用している。

 

インジケータ(3)

明日はいよいよEAを作成していこうかな。

手順としては、

(1)EAの空ファイル作成

(2)毎Tickごとに注文および決済

(3)インジケータを作ったのでそのインジケータより条件を満たしたときに

 注文を行い、決済も行う。

 

一つ作ってて思うのはDelphiの開発環境が使いづらい。

コードを書いていると関数や変数のところにカーソルがあうと"解析中"の文字が出て

強制終了してしまって改めてコードを書き直さないといけないのでだるすぎる

これはどうやって修正するんだろう。

 

 

Forextester6におけるインジケータの作成(2)

 

昨日の言った通り、現在のMA > ひとつ前のMAの条件を満たすときに

ローソク足の下に矢印を表示させるインジケータを作成できた。

 

改良して移動平均線を使った条件式を作成してその条件を満たしたときに

矢印を表示できたので良き。

 

インジケータ作成(2)

この後はボリンジャーバンドを表示できることを確認したら、改良して基準を満たしたときにボリンジャーバンドを表示するプログラムを作成する。

Forextester6におけるインジケータの作成(1)

Forextester6を無事購入できたので

インジケータの作成に取り掛かりたいと思う。

 

C++Delphiといわれる言語のどちらかで作成できるが

サンプルコードを入手しやすかったのはDelphiだった為、

Delphiを使っていこうと思う。

 

Delphidelphi community editionを使用していく。

 

インストールが終わったのでForextester(以下FTと略す)の保存ファイルにサンプルプログラムがあるのでMoving averageをコンパイルして、DLLを作成できた。

 

FTよりカスタムインジケータをインストールして表示することができた。

 

サンプルコード内の解釈を書いていこうかな。

 

Calculate(index: integer); stdcall;

の一文あるがこのindexはint型であり、おそらく計算に使用していないローソク足

本数を示しているのでは?

 

Print関数にてindexを表示するとローソク足が確定した瞬間に"1"を返していた。

 

明日までに

現在のMA > ひとつ前のMA を満たした状態ならローソク足

下に矢印を示すプログラムを作成しようと思う。