2018年4月20日金曜日

モンテカルロ EAとソースコード

取りあえずベースとなるモンテカルロのソースコードを作成してみました。
RSIでエントリーしていますが全くダメですねw

エントリーとそれにあったTPの大きさを見つけて下さい。
PRINTにカラムを表示していますので、みてください!


#property strict
input int Magic=11111;
input string Comments="MonteTACA-USDJPY-M1";
input double BaseLots=0.1;
input double TP=0.02;
int Monte[50],nMonte,d,i,Ticket;

double Vol;
string Sym=Symbol();

int OnInit()
{
for(i=0;i<3;i++){Monte[i]=i+1;}
nMonte=3;
Vol=BaseLots*4;
string Com="";
for(i=0;i<nMonte;i++){Com+=(string)i+" : "+(string)Monte[i]+" \n";}
Print (Com);
return(INIT_SUCCEEDED);}

void OnTick()
{
if(GetLastError()){Print(GetLastError());ExpertRemove();}
int NoP=Pos();
if(NoP && OrderSelect(Ticket,SELECT_BY_TICKET))
{
if(OrderType()==OP_BUY)
{
if(OrderOpenPrice()>Bid+TP)Lose();
if(OrderOpenPrice()<Bid-TP*2)Get();
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()<Ask-TP)Lose();
if(OrderOpenPrice()>Ask+TP*2)Get();
}
}



//++ Entry Logic ++
if(!NoP&&iRSI(Sym,PERIOD_CURRENT,20,PRICE_HIGH,0)<30

)
{
Ticket=OrderSend(Sym,OP_BUY,Vol,Ask,0,Bid-TP*2,Bid+TP*4,Comments,Magic);
Print("OpenLong: "+(string)Vol);
}
if(!NoP&&iRSI(Sym,PERIOD_CURRENT,20,PRICE_LOW,0)>70

    )
        {
        Ticket=OrderSend(Sym,OP_SELL,Vol,Bid,0,Ask+TP*2,Ask-TP*4,Comments,Magic);
Print("OpenShort: "+(string)Vol);
}
//+++++++++++++++++
}//OnTick()





//Get :Close Positin & Set Column
void Get()
{
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0))
{
if (nMonte<6)
{
for(i=0;i<nMonte;i++){Monte[i]=0;}
for(i=0;i<3;i++){Monte[i]=i+1;}
nMonte=3;
Vol=BaseLots*4;
}
else
{
for(i=0;i<nMonte-2;i++)
{Monte[i]=Monte[i+2];}
Monte[i-2]=0;
Monte[i-1]=0;
nMonte-=4;
Vol=BaseLots*(Monte[0]+Monte[nMonte-1]);
}
string Com="Get";
for(i=0;i<nMonte;i++){Com+=(string)i+" : "+(string)Monte[i]+" \n";}
Print (Com);
}
}
//Lose :Close Position & Set Column
void Lose()
{
if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0))
{
Monte[nMonte]=(int)(OrderLots()/BaseLots);
Vol= (Monte[0]+Monte[nMonte])*BaseLots;
nMonte++;
string Com="Lose";
for(i=0;i<nMonte;i++){Com+=(string)i+" : "+(string)Monte[i]+" \n";}
Print (Com);
}
}

//Check Number of Position
int Pos()
{
int cnt = 0;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS)&&OrderMagicNumber()==Magic){cnt++;}
}
return(cnt);}

0 件のコメント:

コメントを投稿