2016年5月31日火曜日

【EAを作ろう】第十一回 シャンデリア・トレーリングを作ろう!

第十回のソースコードの最後の一行が抜けていました。
M氏よりご指摘いただきました。ごめんなさいmm そして、ありがとうございます^^

第十回ではエントリーまで作りました。
今回はシャンデリア・トレーリングです。
実はシャンデリア・トレーリングは死語です。死語というのも死語のような気がしますが・・・
トレーリング・ストップの事なのですがシャンデリア・トレーリングのほうがゴージャスな雰囲気
まさに将来大金持ちになる皆様にふさわしいと思いこちらを愛用しています。

オーダーエントリー時に設定したストップロス、テイクプロフィットに届くのを待つのではなく、
積極的に相場に合わせてストップロスを変更します。
価格が利益獲得方向に進んでいくのに合わせストップロスをスライドさせます。
価格が反転した時にSLに引っかかり終了となります。

バリエーションも多く価格が一定まで上昇した時に発動するタイプ
一定幅でSL幅が変更されるタイプ、時間で幅が狭くなるタイプ
エントリーより長い脚の平均乖離に合わせてSL幅を変更するタイプ

また、リアルタイムでSLを動かすもの、足変更時に動かすもの、価格幅を設定して動かすものなどあります。

extern int UpperLine=70,LowerLine=30,RSIPeriod=20,CTProfit=30,Magic=747;
extern ENUM_APPLIED_PRICE AppliedPrice=0;
extern ENUM_TIMEFRAMES ShortTimeFrames=1;
extern ENUM_TIMEFRAMES LongTimeFrames=5;
double SL,TSL,OTSL;
int d;

void OnTick(){
TS();      
  if(OrdersTotal()==0)  {
    if(RSI(ShortTimeFrames)>UpperLine&&RSI(LongTimeFrames)>UpperLine){EntryShort();}
    if(RSI(ShortTimeFrames)<LowerLine&&RSI(LongTimeFrames)>UpperLine){EntryLong();}
  }
}

double RSI(int Periods){return(iRSI(Symbol(),Periods,RSIPeriod,AppliedPrice,1));}
void EntryLong(){d=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask-CTProfit,0,"Long",Magic,0,clrNONE);}
void EntryShort(){d=OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid+CTProfit,0,"Short",Magic,0,clrNONE);}

void TS(){
d=OrderSelect(0,SELECT_BY_POS);
if(OrderType()==0)
 {if(TSL<Close[0]){TSL=Close[0];SL=TSL-CTProfit*Point;}}
else
 {if(TSL>Close[0]){TSL=Close[0];SL=TSL+CTProfit*Point;}}
if(TSL!=OTSL){OTSL=TSL;
d=OrderSelect(0,SELECT_BY_POS);
d=OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,clrNONE);}}

今回の変更点は一回ずつ宣言していたdを先頭に
StopLoss,TakeProfitの設定をなくし
OnInitもまるごと削りました。
CTProfitがシャンデリアトレーリングの幅です50以下がよいでしょう。
OnTick()直後にTS();関数を呼び出しています。

OrderSelectで注文を選択します。一本しか発注しない場合でも選択する必要があります。
SELECT_BY_POSはモードです。このモードの場合直前の0は直近にオーダーしたオーダー、1その次は2と順々に増えていきます。オーダーするたびにずれていきます。
SELECT_BY_TICKETにした時はチケット番号で選択できます。

OrderType()はOrderSelect()で選んだポジションのタイプです。0はBUY 1はSELLです。

次の行はTSL定数と現在の価格を比較し利益側に動いたときはTSL、SLを更新しています。
TSLは最新の現在価格、SLはストップロス価格です。
OTSLは一つ前のTSL価格です。TSLが変更された=利益側に価格が動いたかを見ています。

そして再びオーダーを選択し
OrderModifyで価格を変更しています。
OrderTicket()はOrdeSelect()で選んだオーダーのチケット番号
OrderOpenPrice()はOrderSelect()で選んだオーダーのエントリ価格です。
OrderModify(チケット番号、エントリー価格、ストップロス、テイクプロフィット、発注期限、矢印)です。

関数紹介になってきましたねw














2 件のコメント:

  1. いよっ!待ってました!
    【EAを作ろう】シリーズ前回までの内容の7割ほどは理解できたような気がします。たぶん。
    そこでブログ初期のノリノリ君から順番にソースコードを解読していってるのですが
    今回までの関数の説明がとても参考になります!ありがとうございます!
    ご紹介いただいた本「iCustom~」26日に注文してやっと今日届いたので
    じっくりと読んでみます。(が想像よりかなり分厚い!w)

    返信削除
  2. ぶりこさん
    わたしも初めは関数が理解できなかったのですが、
    使い始めると便利です!
    エントリーやエグジット、シャンデリアストップなどよく使うものはコピペでいけるので重宝します

    返信削除