ですので、このサイトとは書き方が違う・・・などがあると思いますがご了承下さい。そういうもんです( ・Д・)
潤奈流EAの書き方
私がプログラムを書く際に重要視するのは見た目です!美しく書きましょう( ・Д・)w
まぁ~これは好みの問題ですので、動けばなんでも良いと思いますよw
まず重要視しているのは2点、見易さと効率です。
見易さとは、パッと見たときにどういうロジックを書いているか分かりやすく、プログラムを短くする事です。
何故なら自分で見返したりする時に、「これどうだったっけ~?」てなると時間が勿体ないです。
沢山EAを書いて行くと覚えきれないので、見たときに読みやすいプログラムの方が自分にとっても良いと思っています。それにエラーが発生した時の対処もし易いとも思っています。
2つ目の効率とは、オリジナル関数を活用する事です。
私は役割毎に関数を作成しています。エントリー判断する関数、ポジション数を確認する関数、エントリーする関数、手仕舞いする関数など。
そうする事でロジック部分の見た目がスッキリして読みやすくなります。
他にも新しくEA作成する際にも、コピペで持ってくればすぐに流用する事が出来ます。
コードを見てみないと何を言っているのか分からないと思いますので、今回の参考となるベースEAをご覧下さい( ・Д・)
参考EAコード
今回のEAの内容としては、移動平均線3本のパーフェクトオーダーでエントリーするプログラムになります( ・Д・)
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
#property copyright "Copyright 2020, Zyuna32246" #property link "https://zyunafx.com/" #property version "1.00" #property strict //---パラメーター設定 sinput int MagicNumber=2020; //マジックナンバー input int Slippage=10; //スリッページ input double Lots=0.01; //ロット数 input int TakeProfit=100; //利確幅(pips) input int StopLoss=50; //損切幅(pips) input int TrailingPips=20; //トレーリングストップ(pips) //---インジケーター設定 input int Period1=5; //期間1 input int Period2=25; //期間2 input int Period3=75; //期間3 //---プログラム全体に影響する変数 double Pips; int SLP; //------------------------------------------------------------------------ int OnInit(){ //EA導入時に一度だけ動くプログラム Pips=AdjustPoint(_Symbol); SLP=(int)AdjustSlippage(_Symbol,Slippage); return(INIT_SUCCEEDED); } //------------------------------------------------------------------------ void OnTick(){ //ティック受信する度に動くプログラム //トレーリングストップ TrailingStop(); //ポジション数を確認 int BuyPosition=Position(1); int SellPosition=Position(-1); //エントリー判定 int Entry=PerfectOrder(); if(BuyPosition==0 && Entry==1)OpenOrder(1); if(SellPosition==0 && Entry==-1)OpenOrder(-1); //クローズ判定 if(BuyPosition!=0 && PerfectClose(1)==1)CloseOrder(1); if(SellPosition!=0 && PerfectClose(-1)==-1)CloseOrder(-1); }//OnTick //------------------------------------------------------------------------ void OnDeinit(const int reason){ //EA削除時に最後に動くプログラム } //------------------------------------------------------------------------ //オリジナル関数 //ポジション調整 double AdjustPoint(string Currency){ int SymbolDigits=(int)MarketInfo(Currency,MODE_DIGITS); double CalculatedPoint=0.0; if(SymbolDigits==2 || SymbolDigits==3){ CalculatedPoint=0.01; }else if(SymbolDigits==4 || SymbolDigits==5){ CalculatedPoint=0.0001; } return(CalculatedPoint); } //スリッページ調整 double AdjustSlippage(string Currency,int SlippagePips){ double CalculatedSlippage=0.0; int SymbolDigits=(int)MarketInfo(Currency,MODE_DIGITS); if(SymbolDigits==2 || SymbolDigits==4){ CalculatedSlippage=SlippagePips; }else if(SymbolDigits==3 || SymbolDigits==5){ CalculatedSlippage=SlippagePips*10; } return(CalculatedSlippage); } //ポジション数を取得 int Position(int PositionDirection){ int res=0; for(int i=0;i<OrdersTotal();i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){ if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber){ if(PositionDirection==1){ if(OrderType()==OP_BUY)res++; }else if(PositionDirection==-1){ if(OrderType()==OP_SELL)res++; } } } } return(res); } //ポジションエントリー関数 void OpenOrder(int EntryPosition){ int res=0; double TP=TakeProfit*Pips; double SL=StopLoss*Pips; if(EntryPosition==1){ res=OrderSend(_Symbol,OP_BUY,Lots,Ask,SLP,Ask-SL,Ask+TP,NULL,MagicNumber,0,clrBlue); }else if(EntryPosition==-1){ res=OrderSend(_Symbol,OP_SELL,Lots,Bid,SLP,Bid+SL,Bid-TP,NULL,MagicNumber,0,clrRed); } } //ポジションクローズ関数 void CloseOrder(int ClosePosition){ int res=0; for(int i=OrdersTotal()-1;i>=0;i--){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){ if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber){ if(OrderType()==OP_BUY && ClosePosition==1){ res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),SLP,clrMagenta); }else if(OrderType()==OP_SELL && ClosePosition==-1){ res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),SLP,clrMagenta); } } } } } //トレーリングストップ void TrailingStop(){ double TSP; int res=0; for(int i=OrdersTotal()-1;i>=0;i--){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){ if(OrderSymbol()==_Symbol && OrderMagicNumber()==MagicNumber){ if(OrderType()==OP_BUY){ TSP=Ask-TrailingPips*Pips; if(OrderOpenPrice()<TSP && OrderStopLoss()<TSP){ res=OrderModify(OrderTicket(),OrderOpenPrice(),TSP,0,0,clrYellow); } }else if(OrderType()==OP_SELL){ TSP=Bid+TrailingPips*Pips; if(OrderOpenPrice()>TSP && OrderStopLoss()>TSP){ res=OrderModify(OrderTicket(),OrderOpenPrice(),TSP,0,0,clrYellow); } } } } } } //パーフェクトオーダーエントリー int PerfectOrder(){ int entry=0; double MA1=iMA(_Symbol,0,Period1,0,MODE_SMA,PRICE_CLOSE,1); double MA2=iMA(_Symbol,0,Period2,0,MODE_SMA,PRICE_CLOSE,1); double MA3=iMA(_Symbol,0,Period3,0,MODE_SMA,PRICE_CLOSE,1); if(MA3<MA2 && MA2<MA1)entry=1; if(MA3>MA2 && MA2>MA1)entry=-1; return(entry); } //パーフェクトオーダークローズ int PerfectClose(int Position){ int close=0; double MA1=iMA(_Symbol,0,Period1,0,MODE_SMA,PRICE_CLOSE,1); double MA2=iMA(_Symbol,0,Period2,0,MODE_SMA,PRICE_CLOSE,1); double MA3=iMA(_Symbol,0,Period3,0,MODE_SMA,PRICE_CLOSE,1); if(Position==1){ if(MA3>MA2 || MA2>MA1)close=1; }else if(Position==-1){ if(MA3<MA2 || MA2<MA1)close=-1; } return(close); } |
全体の構成説明
全体の構成を簡単に説明します( ・Д・)
①上から4行はプロパティ
そのEAの情報だったりですね~。
②パラメーター設定
そのままの意味です。
③インジケーター設定
インジケーターのパラメーターを設定します。
④プログラム全体に影響する変数
プログラムの何処でも使用出来るように必要な変数はここで宣言しておきます。
⑤OnInit() EA導入時に一度だけ動く関数
一度だけ動いてくれたらいいプログラムなどはここに入力します。
⑥OnTick() ティック受信する度に動く関数
ここにメインとなるロジックを入力します。
⑦OnDeinit() 最後に一度だけ動く関数
EA削除時やパラメーター変更時、通貨ペア・期間変更時等に動くプログラムを入力します。
⑧その他 オリジナル関数
オリジナルのエントリー関数やトレーリングストップ関数、エントリーロジック関数などを入力します。
次からこの構成部分毎に説明して行きたいと思います( ・Д・)
では( ・Д・)
次の記事「潤奈流EA講座②(プロパティとパラメーター)」
コメント