توابع مدیریت حساب، چند نکته در مورد اکسپرت نویسی
در جلسه پانزدهم دوره متوسطه آموزش اکسپرت نویسی با توابع مدیریت حساب آشنا میشیم. یکی از مباحث مدیریت پوزیشن ها تریدینگ استاپ است. حالا می آییم تریدینگ استاپ را به این بخش اضافه می کنیم. برای استفاده از تابع کافی است تابع رو فراخانی کنیم. توی بهترین بخش که می شود صدا زد توی تابع onTicket است.
در جلسه پانزدهم دوره متوسطه آموزش اکسپرت یک مدیریت پوزیشن دیگری که پیشنهاد میشه که در هر برنامه که می نویسیم، البته اگر استراتژی معالاتی جواب بده یعنی با استراتژی هم خوانی داشته باشه اینکه وقتی که یک پوزیشن رو تریدینگ استاپ می کنیم و پوزیشن ریسک فری شود. یعنی اینکه استاپ می آید بعد از باز شدن پوزیشن، اگر هنوز هم سیستم شما سیگنال بای یا سل داد یک پوزیشن سل یا بای دیگه باز شود.
این استراتژی برای مدیریت پوزیشن ها برای خیلی از برنامه ها جواب می دهد. حالا می آییم در تمرین درس 13 داشته ای تریدینگ استاپ بهش اضافه می کنیم. اگر پوزیشن ها که باز شدن در ریسک فری شدن یعنی تریدینگ استاپ شدن اینقدر جابه جا شد برای بای بیایید بعد از باز شدن پوزیشن و برای سل بیاید زیر باز شد پوزیشن یک پوزیشن جدید باز کنه.
برای اینکه مورینگ ها را چک کنیم باید مورینگ صفر رو چک کنیم که آیا مورینگ 12 بالای 50 است. شرط بای رو هم باید داشته باشه که اگر وجود داشت بیا یک پوزیشن بای دیگه بگیریم. همینطور برای سل برعکس اینکه چک می کنیم مورینگ 12 زیر مورینگ 50 باشه بعد کندل شماره صفر رو چک میکنیم. پس باید یک کد دیگه بنویسیم که کندل صفر مورینگ 12 بزرگتر از مورینگ 50 کندل صفرش بود بیا ک خروجی بای بده.
برای سل مورینگ 12 کوچکتر از مورینگ 50 بود بیا یک سل بده و در زیر به صورت nosignal رو چاک کن.
#property version "2.00"
#property description "khat1"
#property description "khat4"
#property strict
input double lot=0.1;
input int strattime=8;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
Trail();
////////////////////////////////////////
if(movNew()=="buy" && Orders()<2 && reskfree()=="Free BUY")
{
tiket=OrderSend(Symbol(),OP_BUY,lot,Ask,5,0,0,"Rise Group",1111,0,clrBlue);
if(tiket<=0 )
Print("cold not opened Position Error = ",GetLastError());
}
if(movNew()=="sell" && Orders()<2 && reskfree()=="Free Sell")
{
tiket=OrderSend(Symbol(),OP_SELL,lot,Bid,5,0,0,"Rise Group",2222,0,clrRed);
if(tiket<=0 )
Print("cold not opened Position Error = ",GetLastError());
}
////////////////////////////////////////////////////////
if(movStatus()=="buy") close(2222);
if(movStatus()=="sell") close(1111);
if(Volume[0]<=1 && Orders()==0 && Hourfilter()==TRUE)
{
if(movStatus()=="buy"){
tiket=OrderSend(Symbol(),OP_BUY,lot,Ask,5,0,0,"Rise Group",1111,0,clrBlue);
if(tiket<=0 )
Print("cold not opened Position Error = ",GetLastError());
}
if(movStatus()=="sell"){
tiket=OrderSend(Symbol(),OP_SELL,lot,Bid,5,0,0,"Rise Group",2222,0,clrRed);
if(tiket<=0 )
Print("cold not opened Position Error = ",GetLastError());
}
}
}
//+--------------------------------وضعیت مورینگها----------------------------------+
string movStatus()
{
if(iMA(NULL,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE,2)<=iMA(NULL,PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE,2) && iMA(NULL,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE,1)>iMA(NULL,PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE,1))
return("buy");
else if(iMA(NULL,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE,2)>=iMA(NULL,PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE,2)&&iMA(NULL,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE,1)<iMA(NULL,PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE,1))
return("sell");
else return("No signal");
}
string movNew()
{
if (iMA(NULL,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE,0)>iMA(NULL,PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE,0))
return("buy");
else if (iMA(NULL,PERIOD_CURRENT,12,0,MODE_EMA,PRICE_CLOSE,0)<iMA(NULL,PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE,0))
return("sell");
else return("No signal");
}
//------------------------------شمارش پوزیشنها------------------------------------
int Orders()
{
int num=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==1111 || OrderMagicNumber()==2222)
num++;
}
}
return(num);
}
//----------------------------بستن پوزیشنها--------------------------------------
void close(int Magic)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==Magic)
bool yccb =OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,clrGreen);
}
}
}
//----------------------------------فیلتر ساعت--------------------------------
bool Hourfilter()
{
if(Hour()>=strattime && Hour()<=22)
return(true);
else
return(false);
}
//----------------------------------ترلینگ استاپ--------------------------------
void Trail()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==1111)
{
if((Bid-OrderOpenPrice())>50*Point)
{
if(OrderStopLoss()<(Bid-50*Point))
{
bool ordermb=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-50*Point,OrderTakeProfit(),0,clrYellow);
}
}
}
if(OrderMagicNumber()==2222)
{
if((OrderOpenPrice()-Ask)>50*Point)
{
if(OrderStopLoss()>(Ask+50*Point))
{
bool orderms=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+50*Point,OrderTakeProfit(),0,clrYellow);
}
}
}
}
}
}
//----------------------------------چک کردن ریسک فری--------------------------------
string reskfree()
{
if(OrdersTotal()>0)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==OP_BUY && OrderOpenPrice()<OrderStopLoss())
return("Free BUY");
if(OrderType()==OP_SELL && OrderOpenPrice()>OrderStopLoss())
return("Free Sell");
}
}
}
return("No Posetion");
}