のーんびりしたEAを作っています。
条件設定がまだなのですが、スワップの取れる方向にのみエントリーするものです。
例えばAUDJPYでLONG方向にスワップが付くとします。
月、週、日の平均が上昇している時でRSIの条件が合えばエントリーします。
逆に月、週、日の平均のひとつでも下降している時はエントリーしません。
つまりエントリーしない時は何カ月もエントリーなしです。
(設定でスワップが付かない方向にもエントリーさせることができます)
ソースコードは10行以内がいいのですが、見やすくしたら300行程度になってしまいました。
利益確定額、追加発注金額をうまく調整するとのんびり長期にも短期型にもなります。
取りあえずAUDUSDで一ヶ月ほどしてみました。
最後はエントリー中にテスト期限が来て強制クローズで下がっています。
エントリーは最大4本 エントリーして追加発注額損失が出ると1本追加
最初のエントリーから追加発注額の4倍損失でもう一本、6倍でさらにもう一本です。
OANDAベーシック最終EAと似たような画面表示もありますので、自動売買OFFでも使えます。
時間の都合で条件設定が出来ていないのと、ロジックが検討できていませんが、
素敵な設定が出たら教えて下さい。
// This is TACA'S EA FOR OANDA BASIC.
#property copyright"CopyRight,Taca 2016/10/20"
#property description"Testing model"
#property strict
input int MAGIC=54720;//魔法数字
input ENUM_MA_METHOD MAMODE=2;//平均の種類
input int MAPRD=5;//平均の期間
input int RSIPRD=14;//RSIの期間
input int RSIUL=70;//RSIの売りライン
input int RSIDL=30;//RSIの買いライン
input int RSIOrdPrd=1;//RSIの発注期間
input double Lots=0.01;//ロット
input int SpreadLimit=30;//スプレッド上限
input int AdditionalOrder=5000;//追加発注金額
input double Profit=0.5;//利益確定額
input bool SwapMode=False;//スワップモード
input string Com="EA AllTime";//コメント
input color TxtClr=clrWhite;//文字色
input color TxtImpClr=clrYellow;//強調文字
bool SwapUp,SwapDown,SprLim,OrdType,RSIU[6],RSID[6],MAU[6],MAD[6];
color OBJCLR[14];
datetime Past;
double Ave,Prf,SprMax,SprMin,SprAve,SprNow,SprCou=1;
int x[14]={5,5,5,5,150,155,150,172,193,212,233,253,150,230};
int y[14]={25,40,55,70,10,25,40,40,40,40,40,40,55,55};
int Per[6]={43200,10080,1440,60,15,1};
int Pos,i,d,OBJFSI[14];
string Text[14],Obj[14];
string UD[3]={"U","D","N"};
string MAMODETxt[4]={"Simple MA ","Exponential MA ","Smoothed MA ","Linear Weighted MA "};
//+------------------------------------------------------------------+
//|Opening |
//+------------------------------------------------------------------+
int OnInit()
{
for(i=0;i<14;i++)
{
Obj[i]="Label"+(string)i;
ObjectCreate(0,Obj[i],OBJ_LABEL,0,0,0);
ObjectSetInteger(0,Obj[i],OBJPROP_XDISTANCE,x[i]);
ObjectSetInteger(0,Obj[i],OBJPROP_YDISTANCE,y[i]);
ObjectSet(Obj[i],OBJPROP_BACK,true);
ObjectSetInteger(0,Obj[i],OBJPROP_BACK,False);
OBJFSI[i]=8;
OBJCLR[i]=TxtClr;
}
d=ChartSetInteger(0,CHART_COLOR_BACKGROUND,Black);
d=ChartSetInteger(0,CHART_COLOR_FOREGROUND,White);
d=ChartSetInteger(0,CHART_COLOR_GRID,Gray);
d=ChartSetInteger(0,CHART_COLOR_CHART_UP,Red);
d=ChartSetInteger(0,CHART_COLOR_CHART_DOWN,Blue);
d=ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,Red);
d=ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,Blue);
d=ChartSetInteger(0,CHART_COLOR_CHART_LINE,Green);
SprSet();//Spread Setting
SprChk();//Spread Check
Write(); //データー記述
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|Ending |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
for(i=0;i<14;i++){ObjectDelete(Obj[i]);Comment("");}
}
//+------------------------------------------------------------------+
//|CORE |
//+------------------------------------------------------------------+
void OnTick()
{
SprChk();//Spread Check
MAChk();//MAチェック
RSIChk();//RSI CHECK
Order(); //発注機関
StopLoss();//ストップロス
Write(); //データー記述
}
//+------------------------------------------------------------------+
//|Entry Long |
//+------------------------------------------------------------------+
void EntryLong()
{
if(SprLim)
{
d=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+Profit,Com,MAGIC);
OrdType=True;
}
Average();
for(i=OrdersTotal()-1;i>=0;i--)
{
d=OrderSelect(i,0);
if(OrderMagicNumber()==MAGIC)
{
d=OrderModify(OrderTicket(),OrderOpenPrice(),0,Ave+Profit,0);
}
}
}
//+------------------------------------------------------------------+
//|Entry Short |
//+------------------------------------------------------------------+
void EntryShort()
{
if(SprLim)
{
d=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-Profit,Com,MAGIC);
OrdType=False;
}
Average();
for(i=OrdersTotal()-1;i>=0;i--)
{
d=OrderSelect(i,0);
if(OrderMagicNumber()==MAGIC)
{
d=OrderModify(OrderTicket(),OrderOpenPrice(),0,Ave-Profit,0);
}
}
}
//+------------------------------------------------------------------+
//|Averaging |
//+------------------------------------------------------------------+
void Average()
{
Ave=0;Pos=0;
for(i=OrdersTotal()-1;i>=0;i--)
{
d=OrderSelect(i,0);
if(OrderMagicNumber()==MAGIC)
{Ave+=OrderOpenPrice();Pos++;}
}
Ave=Ave/Pos;
}
//+------------------------------------------------------------------+
//|Order Machine |
//+------------------------------------------------------------------+
void Order()
{
if(Time[0]!=Past)
{
Past=Time[0];
//ポジション確認
Pos=0;
for(i=OrdersTotal()-1;i>=0;i--)
{
d=OrderSelect(i,0);
if(OrderMagicNumber()==MAGIC){Pos++;Prf=OrderProfit();}
}
//スワップ
SwapUp=False;
SwapDown=False;
if(MarketInfo(Symbol(),MODE_SWAPLONG )>=0){SwapUp=True;}
if(MarketInfo(Symbol(),MODE_SWAPSHORT)>=0){SwapDown=True;}
if(!SwapMode){SwapUp=True;SwapDown=True;}
//初回発注
if(MAU[0]&&MAU[1]&&MAU[2]&& RSI(RSIOrdPrd)<RSIDL && Pos==0 && SwapUp){EntryLong(); }
if(MAD[0]&&MAD[1]&&MAD[2]&& RSI(RSIOrdPrd)>RSIUL && Pos==0 && SwapDown){EntryShort();}
//追加発注1
if(OrdType && MAU[0]&&MAU[1]&&MAU[2]&& RSI(RSIOrdPrd)<RSIDL && Pos==1 && SwapUp && Prf<-AdditionalOrder){EntryLong();}
if(!OrdType && MAD[0]&&MAD[1]&&MAD[2]&& RSI(RSIOrdPrd)>RSIDL && Pos==1 && SwapDown && Prf<-AdditionalOrder){EntryShort();}
//追加発注2
if(OrdType && MAU[0]&&MAU[1]&&MAU[2]&& RSI(RSIOrdPrd)<RSIDL && Pos==2 && SwapUp && Prf<-AdditionalOrder*3){EntryLong();}
if(!OrdType && MAD[0]&&MAD[1]&&MAD[2]&& RSI(RSIOrdPrd)>RSIDL && Pos==2 && SwapDown && Prf<-AdditionalOrder*3){EntryShort();}
//追加発注3
if(OrdType && MAU[0]&&MAU[1]&&MAU[2]&& RSI(RSIOrdPrd)<RSIDL && Pos==3 && SwapUp && Prf<-AdditionalOrder*5){EntryLong();}
if(!OrdType && MAD[0]&&MAD[1]&&MAD[2]&& RSI(RSIOrdPrd)>RSIDL && Pos==3 && SwapDown && Prf<-AdditionalOrder*5){EntryShort();}
}
}
//+------------------------------------------------------------------+
//|StopLoss |
//+------------------------------------------------------------------+
void StopLoss()
{
if(OrdType && RSID[0] && !RSIU[0]){CloseAll();}
if(!OrdType && RSIU[0] && !RSID[0]){CloseAll();}
}
//+------------------------------------------------------------------+
//|Write on Display |
//+------------------------------------------------------------------+
void Write()
{
//if(IsDemo() && !IsVisualMode()){return;}
//Note Time
Text[4]="MN W1 D1 H1 QH M1";
//Note MA
Text[0]=MAMODETxt[MAMODE]+"("+(string)MAPRD+") ";
Text[5]=NULL;
for(i=0;i<6;i++)
{
if(MAU[i]){Text[5]+=UD[0]+" ";}
else if (MAD[i]){Text[5]+=UD[1]+" ";}
else{Text[5]+=UD[2]+" ";}
}
//Note RSI
Text[1]="RSI("+(string)RSIPRD+")";
for(i=6;i<12;i++)
{
Text[i]=(string)RSI(Per[i-6]);
OBJFSI[i]=8;
OBJCLR[i]=TxtClr;
if(RSIU[i-6]){OBJFSI[i]=10;OBJCLR[i]=TxtImpClr;}
if(RSID[i-6]){OBJFSI[i]=10;OBJCLR[i]=TxtImpClr;}
}
//Note SWAP
Text[2]="SWAP";
double TF;
//SWAP LONG
TF=NormalizeDouble(MarketInfo(Symbol(),MODE_SWAPLONG),3);
Text[12]="Long ";
if(TF>=0){Text[12]+=StringSubstr((string)TF,0,4);}
else{Text[12]+=StringSubstr((string)TF,0,5);}
//SWAP SHORT
TF=NormalizeDouble(MarketInfo(Symbol(),MODE_SWAPSHORT),3);
Text[13]="Short ";
if(TF>=0){Text[13]+=StringSubstr((string)TF,0,4);}
else{Text[13]+=StringSubstr((string)TF,0,5);}
if(SwapUp){OBJFSI[12]=10;OBJCLR[12]=TxtImpClr;}else{OBJFSI[12]=8;OBJCLR[12]=TxtClr;}
if(SwapDown){OBJFSI[13]=10;OBJCLR[13]=TxtImpClr;}else{OBJFSI[13]=8;OBJCLR[13]=TxtClr;}
//Note SPREAD
Text[3]="SPREAD Now "+(string)SprNow+" / Max "+(string)SprMax
+" / Min "+(string)SprMin+" / Ave "+(string)NormalizeDouble(SprAve,1);
//Display
for(i=0;i<14;i++){ObjectSetText(Obj[i],Text[i],OBJFSI[i],"Verdana",OBJCLR[i]);}
}
//+------------------------------------------------------------------+
//|MA CHECK |
//+------------------------------------------------------------------+
void MAChk()
{
for(i=5;i>=0;i--)
{
MAU[i]=False;
MAD[i]=False;
if(MA(Per[i],2)<MA(Per[i],1)){MAU[i]=True;}
if(MA(Per[i],2)>MA(Per[i],1)){MAD[i]=True;}
if(i==5&&!MAU[5]&&!MAD[5]){MAU[5]=True;MAD[5]=True;}
if(MAU[i]==MAD[i]){MAU[i]=MAU[i-1];MAD[i]=MAD[i-1];}
}
}
//+------------------------------------------------------------------+
//|Moving Avarage |
//+------------------------------------------------------------------+
double MA(int Prd,int Times){return(iMA(Symbol(),Prd,MAPRD,0,MAMODE,PRICE_CLOSE,Times));}
//+------------------------------------------------------------------+
//|RSI Check |
//+------------------------------------------------------------------+
void RSIChk()
{
for(i=0;i<6;i++)
{
RSIU[i]=False;
RSID[i]=False;
if(RSI(Per[i])>RSIUL||RSI(Per[i])==0){RSIU[i]=True;}
if(RSI(Per[i])<RSIDL||RSI(Per[i])==0){RSID[i]=True;}
}
}
//+------------------------------------------------------------------+
//|RSI |
//+------------------------------------------------------------------+
int RSI(int Prd)
{return((int)iRSI(Symbol(),Prd,RSIPRD,PRICE_CLOSE,0));}
//+------------------------------------------------------------------+
//|Spread Check |
//+------------------------------------------------------------------+
void SprChk()
{
SprNow=MarketInfo(Symbol(),MODE_SPREAD);
SprCou++;
SprAve=(SprAve*(SprCou-1)+SprNow)/SprCou;
if(SprMax<=SprNow){SprMax=SprNow;}
if(SprMin>=SprNow && SprNow!=0){SprMin=SprNow;}
if(SpreadLimit>=SprNow){SprLim=True;}else{SprLim=False;}
}
//+------------------------------------------------------------------+
//|Spread Setting |
//+------------------------------------------------------------------+
void SprSet()
{
SprNow=MarketInfo(Symbol(),MODE_SPREAD);
SprMax=SprNow;
SprMin=SprNow;
SprAve=SprNow;
}
//+------------------------------------------------------------------+
//|CloseAll |
//+------------------------------------------------------------------+
void CloseAll()
{
for(i=OrdersTotal()-1;i>=0;i--)
{
d=OrderSelect(i,0);
if(OrderMagicNumber()==MAGIC){d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);}
}
}
//+------------------------------------------------------------------+