طلب مساعدة في صناعة اكسبيرت
السلام عليكم
ارجو من الاخوة المبرمجين المساعدة في كود اكسبيرت اتعبني
بالحقيقة انا لست خبير بالبرمجة ولكني احاول التعلم قدر الامكان
الفكرة هي الدخول في صفقة حسب اشارة الماكد اذا كانت اكبر من قيمة يتم تحديدها من الخارج والبيع بالعكس
فاذا تحقق الهدف فالحمدلله
واذا اغلقت الصفقة خاسرة يقوم بالدخول بعقد مضاعف عند تحقق شروط دخول جديدة بيع او شراء
حسب الفرصة التالية
وهكذا حتى يتم تحقيق الهدف لاخر مضاعفة ثم يبدأ من جديد
الكود مرفق
المطلوب فضلا لا امرا
1- اضافة خاصية المضاعفة .
2-اضافة خاصية ايقاف الاكسبيرت عن العمل في فترة زمنية يتم تحديدها من الخارج مثلا من الساعة كذا الى الساعة كذا(لعدم زيادة المضاعفات في فترة التذبذب (الفترة الاسيوية ونهاية الامريكية))
والشكر مقدما مع خالص الدعاء
كود:
extern double TakeProfit = 30;
extern double StopLoss = 30;
extern double Lots = 0.1;
extern double TrailingStop = 20;
extern double MACDByeLevel = 0.001;
extern double MACDSellLevel = -0.001;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double MacdCurrent, MacdPrevious;
int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // check TakeProfit
}
// to simplify the coding and speed up access
// data are put into internal variables
MacdCurrent=iMACD(NULL,0,5,13,1,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,5,13,1,PRICE_CLOSE,MODE_MAIN,1);
total=OrdersTotal();
if(total<1)
{
// no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if(MacdCurrent>MACDByeLevel && MacdPrevious<MacdCurrent)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// check for short position (SELL) possibility
if(MacdCurrent<MACDSellLevel && MacdPrevious>MacdCurrent)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
// it is important to enter the market correctly,
// but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(Bid < OrderOpenPrice()-Point*StopLoss)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(Ask > OrderOpenPrice()+ Point*StopLoss)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// the end
رد: طلب مساعدة في صناعة اكسبيرت