単なる日記
EAを作成するのは結構チャート検証をするのが大変(地味)なので
モチベをなくさないようにリアルトレードもちょこちょこやっていこうかなって
思う。
やっぱり勝ち負けがリアルにあったほうが手法を考える上で真剣になれそう。
負けても授業料だと思ってやることした。
本日は-9820円
勝率的には半分だったけど、大きく負けたのが一回あって
その時がレンジ相場っていうのもあって、ナンピンして戻りを期待したけど
結局戻らずに大きくマイナスになったのが原因。
負けているときのナンピンはほんとよくないね。
せっかく損切りすれば大きな傷にはならないのに負けてる状況をどうしても
取り戻したいって言う気持ちが出ちゃってナンピンしてるね。
負けているときのナンピンはなしにしようと思う。
戒めのルールとして、絶対にこれだけは守ろう。
後ちゃんと損切を設定していたに動かしてナンピンしてるので、
損切ラインもちゃんと決めたら動かさないこと。
Forextester6におけるEAの作成(4)
EAを作成してテストしてみた結果、改善の余地があって良き。
→そら適当なお試しのロジックで組んだのでそうなる。
【条件】
期間:約3ヶ月
利確:200pips
損切:100pips

総トレード数は449回で勝率はほぼ3割となった。ほとんどのトレードで負けてしまっている。pips換算で行くと、-7745pipsとなっているので、月平均にすると2500pips程
負けてしまっている。
連敗は7であるので連敗数はそこまで大きくはないのかなって思う。
ひとまず適当ロジックでEAを回しても検証の仕方を考えるのでこのEAをプラス域にすることを目標としようかな。
やること
〇負けているエントリーのみに注目し、どのような特徴があるか確認。
→パターンなどが見つかったらそのパターンを落とし込み、EAに反映させ
注文しないようにする。
Forextester6におけるEAの作成(3)
EAをテストで作成し、動作させてみたがやたら大体同じ値幅で注文することが
あったので、注文数を制限するプログラムをしてみる。
変数宣言
ordertype_buy,ordertype_sell : integer; //注文数を格納する
処理内容
ordertype_buy := 0;
ordertype_sell := 0;
for i;=0 to OrdersTotal-1 do
begin
Orderselect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderType = tp_Buy) then
ordertype_buy := ordertype_buy + 1
else if (OrderType = tp_Sell) then
ordertype_sell := ordertype_sell +1;
end;
if ordertype_buy < 1(制限する注文数) then
SendInstantOrder(Symbol, op_buy,~省略);
if ordertype_sell < 1 then
SendInstantOrder(Symbol, op_sell,~省略);

プログラムを動かしてみたところ緑線からEAを動かし新しいローソク足が形成された時に、売りと買いの両方を注文するようにしている。
条件としては売り買い共に注文数が3以上超えないように制限している。
とても見づらいかもしれないがローソク足が緑線から5本以上作られているが、
注文は緑線から右の3つのローソク足のみになっている為、
注文数を制限するプログラムはちゃんと動いてそう。
明日はいよいよEAを本格的に動かしてみようと思う。
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;
と変更してあげればエラーを回避できた。