//+------------------------------------------------------------------+ //| MA-EA-TSTOPS.mq4 | //| Copyright(c) 2010 Masaru Sasaki | //| http://youtarou.blogzine.jp | //+------------------------------------------------------------------+ // < MetaTrader4 FX(外国為替証拠金取引)自動トレイリングシステムEA > // 「ソースコード公開理由」 // *一般的な個人トレーダーの一人として、プログラムに不慣れな方への // 参考として公開する事にしました。 // 自分は幸いにもプログラミングを趣味として来たサンデープログラマー // である事から、システムプログラミング(EA)ができました。 // プログラミングは習うより、慣れろだと思います。 // // 「禁止事項」 // *このプログラムソースコードをそのまま流用したソフトの販売等を // 一切禁止致します。 // // 「免責事項」 // *このプログラムに基づく行為の結果発生した障害、損失などについて // 著作者は一切の責任を負いません。 // // 「説明」 // *裁量トレードにてエントリーした後のトレイリングストップを自動化する // EAです。(自動売買はしません。) // 挿入したチャートの通貨で、1オーダーのみ対応します。 // 複数オーダーには対応していません。 // 使用方法としては、裁量トレードにてエントリーした後にEA稼動を許可 // とするだけです。 // 又、トレイリングストップ方法を一定幅(pips単位)か一定幅で無い // (指定範囲の高値安値)かを選択できます。 // 一定幅はpips単位で設定できます。 // // (注意:オーダーのマジック番号を見ていませんので、他のEAで同じ通貨 // とは共存できません。 // // 参考書籍:FXメタトレーダー入門 (PanRolling) // FXメタトレーダー実践プログラミング (PanRolling) // #property copyright "Copyright(c) 2010 Masaru Sasaki" #property link "http://youtarou.blogzine.jp" // 一定幅で無いトレイリングストップのバーを見る数 extern int HL_period = 20; // 一定幅トレイリングストップを選択した時のサイズ(pips) extern int sp_size = 5; // トレイリングストップ方法の選択(標準は一定幅で無い方式) extern int TrailingStop_select = 1; // デバッグ on/off フラグ bool debug = false; // 一定幅で無いトレイリングストップ関数(指定したバー数の高値、安値) bool TrailingStopHL(int HL_period, double ask, double bid, int ticket, int type) { // トレイリングストップ計算 double spread = ask-bid; double HH = High[iHighest(NULL, 0, MODE_HIGH, HL_period, 1)] + spread; double LL = Low[iLowest(NULL, 0, MODE_LOW, HL_period, 1)]; bool ret = false; OrderSelect(ticket, SELECT_BY_TICKET); if( type == OP_BUY ) { if( LL > OrderStopLoss() ) ret = OrderModify( ticket, OrderOpenPrice(), LL, OrderTakeProfit(), 0, Blue); } if( type == OP_SELL ) { if( HH < OrderStopLoss() || OrderStopLoss() == 0 ) ret = OrderModify( ticket, OrderOpenPrice(), HH, OrderTakeProfit(), 0, Blue); } return(ret); } // 一定幅のトレイリングストップ関数(pips単位) bool TrailingStopSetsize(int setsize, double point, double ask, double bid, int ticket, int type) { // トレイリングストップ計算 bool ret = false; double profit = 0.0; double set_size = setsize * point; double spread = ask - bid; int i = 1000; OrderSelect(ticket, SELECT_BY_TICKET); while( i > 0 ) { if( type == OP_BUY ) { profit = ask - OrderOpenPrice() - (set_size * i + spread); if( profit > 0 ) { ret = OrderModify(ticket, OrderOpenPrice(), OrderStopLoss() + set_size, OrderTakeProfit(), 0, Blue); return(ret); } } if( type == OP_SELL ) { profit = OrderOpenPrice() - bid - (set_size * i + spread); if( profit > 0 ) { ret = OrderModify(ticket, OrderOpenPrice(), OrderStopLoss() - set_size, OrderTakeProfit(), 0, Blue); return(ret); } } i--; } return(false); } //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { // バーの始値でトレード可能かチェック if( Volume[0] > 1 || IsTradeAllowed() == false ) return(0); // オーダー有無のチェック int ticket = 0; bool ret = false; for(int i = 0; i < OrdersTotal(); i++ ) { if(OrderSelect(i, SELECT_BY_POS) == false) break; if(OrderSymbol() != Symbol()) continue; int type = OrderType(); if(type == OP_BUY || type == OP_SELL) { ticket = OrderTicket(); break; } } if(ticket == 0) return(0); if( TrailingStop_select == 1 ) { // 一定幅で無いトレイリングストップ関数呼び出し ret = TrailingStopHL(HL_period, Ask, Bid, ticket, type); } else { // 一定幅のトレイリングストップ関数呼び出し ret = TrailingStopSetsize(sp_size, Point, Ask, Bid, ticket, type); } // デバッグ表示 if( debug == true ) { Print("Open :", Open[1], "Close :", Close[1]); Print("Trailing stop :", ret); } return(0); } //+------------------------------------------------------------------+