انا حاولت اعمل باك تيست بس لا يفتح صفقات من الاساس سأفتح موضوع وارفق الاكسبيرت وشكرا اخي العزيز على الاهتمام والرد
Printable View
تفضل هذه المشاركه
https://forum.arabictrader.com/t137708.html#post2311287
السلام عليكم ورحمه الله
استاذ الكريم مستر دولار ممكن تشرح لي هده كود
كود:void OnTick()
{
chain[1]=Lots_1;
chain[2]=Lots_2;
chain[3]=Lots_3;
chain[4]=Lots_4;
chain[5]=Lots_5;
chain[6]=Lots_6;
chain[7]=Lots_7;
chain[8]=Lots_8;
chain[9]=Lots_9;
chain[10]=Lots_10;
chain[11]=Lots_11;
chain[12]=Lots_12;
chain[13]=Lots_13;
chain[14]=Lots_14;
chain[15]=Lots_15;
chain[16]=Lots_16;
chain[17]=Lots_17;
chain[18]=Lots_18;
chain[19]=Lots_19;
chain[20]=Lots_20;
if(UseHideTP_SL)
{
if(HideTakeprofit>0){CloseBuyOrdersHiddenTP();CloseSellOrdersHiddenTP();}
if(HideStoploss>0){CloseBuyOrdersHiddenSL();CloseSellOrdersHiddenSL();}
}
if((USD_Profit!=0&&Profit()>USD_Profit)||(USD_Loss!=0&&Profit()<-USD_Loss))
{
CloseDeleteOrders();
}
if(LEVEL()+1>MainLevel&&Profit()>MainProfit)
{
CloseDeleteOrders();
}
if(Orders(OP_BUY)==0){CloseDeleteOrders(OP_SELLSTOP);}
if(Orders(OP_SELL)==0){CloseDeleteOrders(OP_BUYSTOP);}
int ticket;
string comment;
double ps,tps,pb,tpb,sls,slb,NewLots,PendingPrice,SL,TP,SLB,TPB,SLS,TPS;
if(Orders(OP_SELLSTOP)==0&&Orders(OP_BUYSTOP)==0)
{
if(LotsLevels&&!LotsMultiply)
{
if(LEVEL()<MaxLevel){NewLots=chain[LEVEL()+1];comment=DoubleToStr(LEVEL()+1,0);}
if(LEVEL()==MaxLevel){NewLots=FirstLots;comment="0";}
}
if(!LotsLevels&&LotsMultiply)
{
NewLots=MathMin(NormalizeDouble(LastOrderLots()*LotsMpOnLoss,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(NewLots>MaxLots)NewLots=FirstLots;
}
}
if((LotsLevels&&LotsMultiply)||(!LotsLevels&&!LotsMultiply)){NewLots=FirstLots;comment="0";}
for(int i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
if(OrderType()==OP_SELL)
{
ps=OrderOpenPrice();
tps=OrderTakeProfit();
sls=OrderStopLoss();
}
if(OrderType()==OP_BUY)
{
pb=OrderOpenPrice();
tpb=OrderTakeProfit();
slb=OrderStopLoss();
}
}
}
PendingPrice=Bid+ZonePips*point;
PendingPrice=Ask-ZonePips*point;
if(UseTP_SL){SLB=tps;TPB=sls;}
else if(!UseTP_SL){TPB=0;SLB=0;}
if(UseTP_SL){SLS=tpb;TPS=slb;}
else if(!UseTP_SL){TPS=0;SLS=0;}
if(Orders(OP_SELL)>0&&Orders(OP_SELLSTOP)==0&&Orders(OP_BUYSTOP)<1)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,NewLots,PendingPrice,3,PendingPrice-SLB,PendingPrice+TPB,comment,MagicNo,0,Blue);
}
if(Orders(OP_BUY)>0&&Orders(OP_BUYSTOP)==0&&Orders(OP_SELLSTOP)<1)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,NewLots,PendingPrice,3,PendingPrice+SLS,PendingPrice-TPS,comment,MagicNo,0,Red);
}
if((Orders(OP_BUY)+Orders(OP_SELL)+Orders(OP_BUYSTOP)+Orders(OP_SELLSTOP))==0)
{
//-----------------------BUY Order
if(OpenBuy&&ContinueTrade)
{
if(Orders(OP_BUY)<1)
{
if(UseTP_SL&&Stoploss!=0){SL=Ask-Stoploss*point;}else if(!UseTP_SL||Stoploss==0)SL=0;
if(UseTP_SL&&Takeprofit!=0){TP=Ask+Takeprofit*point;}else if(!UseTP_SL||Stoploss==0)TP=0;
ticket=OrderSend(Symbol(),OP_BUY,FirstLots,NormalizeDouble(Ask,Digits),3,SL,TP,"0",MagicNo,0,Blue);
}
}
//-----------------------SELL Order
if(!OpenBuy&&ContinueTrade)
{
if(Orders(OP_SELL)<1)
{
if(UseTP_SL&&Stoploss!=0){SL=Bid+Stoploss*point;}else if(!UseTP_SL||Stoploss==0)SL=0;
if(UseTP_SL&&Takeprofit!=0){TP=Bid-Takeprofit*point;}else if(!UseTP_SL||Takeprofit==0)TP=0;
ticket=OrderSend(Symbol(),OP_SELL,FirstLots,NormalizeDouble(Bid,Digits),3,SL,TP,"0",MagicNo,0,Red);
}
}
}
}
int LEVEL()
{
int c;
string comment;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
comment=OrderComment();
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
StringReplace(comment,"[sl]","");
c=StrToInteger(comment);
return(c);
}
}
return(c);
}
ارجو المعذره استاذى الكريم
اسف جدا على الازعاج
طيب كيف يتم وضع البريك ايفن المخفى
على نفس الاكسبيرت الموجود فيه التريلنج استوب المخفى
تم المحاوله اكثر من مره بس لم انجح
ارجو المساعده
ولك الشكر والتقدير
الإكسبرت يعتمد في معرفة حجم لوت الصفقه القادمه وعدد الصفقات التي تم فتحها على كومنت الصفقه
في البداية يعطي أول صفقة يتم فتحها الكومنت 0
إذا أغلقت الصفقة على الأستوب لوز فتلقائيا يصبح كومنت الصفقه المغلقه 0 [SL]
لذلك يستخدم الداله
بحيث يحفظ الكومنت للصفقه ويحذف جزء [sl] ويعود بالرقم في الكومنتكود PHP:
int LEVEL()
{
int c;
string comment;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
comment=OrderComment();
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
StringReplace(comment,"[sl]","");
c=StrToInteger(comment);
return(c);
}
}
return(c);
}
ثم عند وضع الأمر المعلق الجديد
يجعل حجم لوت الصفقه التاليهكود PHP:
if(Orders(OP_SELLSTOP)==0&&Orders(OP_BUYSTOP)==0)
{
if(LotsLevels&&!LotsMultiply)
{
if(LEVEL()<MaxLevel){NewLots=chain[LEVEL()+1];comment=DoubleToStr(LEVEL()+1,0);}
if(LEVEL()==MaxLevel){NewLots=FirstLots;comment="0";}
}
if(!LotsLevels&&LotsMultiply)
{
NewLots=MathMin(NormalizeDouble(LastOrderLots()*LotsMpOnLoss,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(NewLots>MaxLots)NewLots=FirstLots;
}
}
مثلا لو كان الكومنت للصفقه الأولى هو 0 بالتالي سوف يصبح حجم لوت الصفقه التاليه هوكود PHP:
NewLots=chain[LEVEL()+1];
وسوف تجد أنه قام بتعريف المصفوفه chan وضع حجم لوت لكل عنصر في المصفوفهكود PHP:
chan[0+1]
وبنفس الطريقة سوف يغير قيمة الكومنت للصفقه التاليه
الجزء الأخير هو معرفة سعر إفتتاح والهدف والأستوب لوز لآخر صفقه مفتوحه حتى يضع الأمر المعلق العكسي لهاكود PHP:
comment=DoubleToStr(LEVEL()+1,0);
كود PHP:
for(int i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
if(OrderType()==OP_SELL)
{
ps=OrderOpenPrice();
tps=OrderTakeProfit();
sls=OrderStopLoss();
}
if(OrderType()==OP_BUY)
{
pb=OrderOpenPrice();
tpb=OrderTakeProfit();
slb=OrderStopLoss();
}
}
}
الفرق فقط بين التريلينج ستوب والبريك إيفن هو أن البريك إيفن بعد أول تحريك سوف يتوقف ولن يتحرك كلما زاد ربح الصفقه
بالتالي سوف تغير الشرط فقط من
إلىكود PHP:
if((GlobalVariableGet(ticket+"TSS"+Symbol()+Period())>(NormalizeDouble(Ask+TrailingStop*pt,Digits)))||(GlobalVariableGet(ticket+"TSS"+Symbol()+Period())==0))
بحيث بمجرد أن يحرك السعر إلى البريك إيفن لن يتحقق هذا الشرط مره أخرى بالتالي عمله سيكون مره واحده فقطكود PHP:
if((GlobalVariableGet(ticket+"TSS"+Symbol()+Period())==0))
ولا تنسى أن تغير أسماء المتغيرات حتى لا تتعارض مع أسماء التريلينج ستوب
هذا سيعتمد على فكرة الإكسبرت نفسه هل يمكن تنفيذها أم لأ
كفكرة بسيطه مثلا لإكسبرت بمجرد فتح أمر يضع أمر عكسي معلق فيمكن بدلا من وضع الأمر العكسي المعلق يمكن أن يفتح الأمر العكسي عندما يصل السعر إلى هذه النقطه
وهكذا.
يمكنك تجربة إستخدام نفس طريقة التريلينج ستوب المخفي لكن لم أستخدمها سابقا
جزاك الله عنا كل خيراستاذى الكريم مستر دولار