MQL4でFX自動システムを作っています。
実現したいこと
エントリーをする時にロット数でエントリーするのではなく、
有効証拠金が〇〇円だったら〇〇ロットでエントリーをする。とう言うのをつけたいです。
パラメーターで変更可能にしたいです。
有効証拠金が増えるたびにロット数が変更する感じにしたいです。
例
有効証拠金が10万円でしたら、1ロットでエントリー。
利確後11万円で1.1ロットでエントリーする。
該当のソースコード
#property strict
extern int magic=1;
extern double lots=0.01;
extern double slippage=3;
extern int fast=9;
extern int slow=17;
extern double nampin=300;
extern int maxnampin=10;
extern int rieki=1000;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
extern string RSI_Config="RSI設定"; // RSI設定
extern bool RSI_Use = true ; // フィルター利用
extern int RSI_Period=14; // RSI期間
extern double RSI_BuyOpen = 30; // 買いエントリー閾値
extern double RSI_SellOpen = 70; // 売りエントリー閾値
bool rsi(int shift=0, int timeframe=0){
double rsi=iRSI(NULL,timeframe,RSI_Period,PRICE_CLOSE,shift);
if(RSI_BuyOpen > rsi) return true; else if(RSI_SellOpen < rsi) return true; return false;
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if( AccountNumber() != 252057445)
{
Comment("口座認証されていません");
return(0);
}
Comment("認証済口座");
//----
int cnt; int CurrentPosition; int Ticket; double profit; CurrentPosition=-1; for(cnt=0;cnt<OrdersTotal();cnt++) { if(OrderSelect(cnt,SELECT_BY_POS)==false)continue; if(OrderMagicNumber()!=magic)continue; profit=profit+OrderProfit(); if(OrderMagicNumber()==magic)CurrentPosition=cnt; } if(CurrentPosition==-1) { if(MAcross(fast,slow)==1 && rsi() == 1) { Ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,0,0,"buy",magic,0,Blue); } if(MAcross(fast,slow)==2 && rsi() == 2) { Ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,0,0,"sell",magic,0,Red); } } else { OrderSelect(CurrentPosition,SELECT_BY_POS); if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(OrdersTotal()<(maxnampin+1)&&Close[0]<(OrderOpenPrice()-nampin*Point)) { Ticket=OrderSend(Symbol(),OP_BUY,OrderLots()*3,Ask,slippage,0,0,"buy2",magic,0,Blue); } if(profit>rieki) { allClose(Green); } } if(OrderType()==OP_SELL) { if(OrdersTotal()<(maxnampin+1)&&Close[0]>(OrderOpenPrice()+nampin*Point)) { Ticket=OrderSend(Symbol(),OP_SELL,OrderLots()*3,Bid,slippage,0,0,"sell2",magic,0,Red); } if(profit>rieki) { allClose(Yellow); } } } }
//----
return(0);
}
//+------------------------------------------------------------------+
int MAcross(int fast,int slow)
{
double kakoa,kakob; double gennzaia,gennzaib; kakoa=iMA(NULL,0,fast,0,MODE_SMA,PRICE_CLOSE,1); kakob=iMA(NULL,0,slow,0,MODE_SMA,PRICE_CLOSE,1); gennzaia=iMA(NULL,0,fast,0,MODE_SMA,PRICE_CLOSE,0); gennzaib=iMA(NULL,0,slow,0,MODE_SMA,PRICE_CLOSE,0); if(kakoa<kakob&&gennzaia>=gennzaib) { return(1); } if(kakoa>kakob&&gennzaia<=gennzaib) { return(2); }
return(0);
}
void allClose(color clr)
{
int i; for(i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue; if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,NormalizeDouble(slippage,0),clr); if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,NormalizeDouble(slippage,0),clr); }
}
0 コメント