السلام عليكم ورحمة الله وبركاتة
الأستاذ الفاضل أسامة بعد التحية .
لقد قمت بعمل أكسبرت يعمل بعد أخذ صفقة لها هدف وأستوب يدوى ولكن لا ينفذ الشروط أرجوا الأطلاع على الكود وتعرفنى اين الخطأ
والفكرة هى: عندما يتحقق التيك بروفت يفتح مباشرة صفقة جديدة سواء كانت بيع أو شراء
وعندما يضرب الستوب لوز يفتح صففقة مباشرة جديدة ,بمعنى اذا كانت الصفقة شراء وضربت استوب يأخذ شراء ايضا وكذلك للبيع
كود:
int orderscnt(int type)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber&&OrderType()==type){
cnt++;
}
}
}
return(cnt);
}
double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal();i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int ot=OrderType(),
mn=OrderMagicNumber();
double pt=OrderProfit();
double sl=OrderStopLoss();
if(sy==Symbol()&&mn==MagicNumber&&(ot==type||type==-1))
{
if(info=="Type")return(ot);
if(info=="Profit")return(pt);
else if(info=="LOSS")return(sl);
}
}
return(0);
}
double order_stoploss = OrderStopLoss();
double order_takeprofit = OrderTakeProfit();
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(LastOrder("Type")==OP_BUY&&LastOrder("Profit",OP_BUY)>0)Buy();
if(LastOrder("Type")==OP_BUY&&LastOrder("LOSS",OP_BUY)>0)Buy();
if(LastOrder("Type")==OP_SELL&&LastOrder("Profit",OP_SELL)>0)Sell();
if(LastOrder("Type")==OP_SELL&&LastOrder("LOSS",OP_SELL)>0)Sell();
}
void Buy()
{
double ask_76 = MarketInfo(Symbol(), MODE_ASK);
double bid_84 = MarketInfo(Symbol(), MODE_BID);
double price=NormalizeDouble(Ask,digits);
if(orderscnt(OP_BUY)<1){
if ((order_takeprofit < ask_76 + TakeProfit * point) && bid_84 - OrderOpenPrice() > VALL&&Time0!=iTime(Symbol(),0,0)){
order_stoploss =( bid_84 - StopLoss - AddPriceGap);
order_takeprofit=( ask_76 + TakeProfit * point);
int ticket=-1;
ticket=OrderSend(Symbol(),OP_BUY,Lots,price,Slippage*Q,0,0,"",MagicNumber,0,Blue);
if(ticket>-1)
{
bool select=OrderSelect(ticket,SELECT_BY_TICKET);
bool ret=OrderModify(OrderTicket(),OrderOpenPrice(),order_stoploss,order_takeprofit,0,Red);
}
if(UseSound)PlaySound("Alert.wav");
Time0=iTime(Symbol(),0,0);
}
}
}
//+---------------------------------------------------------------------------------+
void Sell()
{
double ask_76 = MarketInfo(Symbol(), MODE_ASK);
double bid_84 = MarketInfo(Symbol(), MODE_BID);
double price=NormalizeDouble(Bid,digits);
if ((order_takeprofit > bid_84 - TakeProfit * point) && OrderOpenPrice() - ask_76 > VALL &&Time0!=iTime(Symbol(),0,0)) {
order_stoploss =(ask_76 + StopLoss + AddPriceGap);
order_takeprofit =(bid_84 - TakeProfit * point);
if(orderscnt(OP_SELL)<1){
int ticket=-1;
ticket= OrderSend(Symbol(),OP_SELL,Lots,price,Slippage*Q,0,0,"",MagicNumber,0,Red);
if(ticket>-1)
{
bool select=OrderSelect(ticket,SELECT_BY_TICKET);
bool ret=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Red);
}
if(UseSound)PlaySound("Alert.wav");
Time0=iTime(Symbol(),0,0);
}
}
}