وعليكم السلام ورحمة الله وبركاته
مثال :
أو يمكنك حساب الفرق مباشرةكود PHP:double spread=MarketInfo(Symbol(),MODE_SPREAD);
كود PHP:double spread=Ask-Bid;
Printable View
شكرا يا أستاذ
أنا أقصد السبريد إلي بيتنفذ أثناء الباكتست يعني لما بفتح صفقة بتاريخ مثلا 1-1-2012 السبريد بيتجاب في الصفقة دي من ملف الهيستوري ولا بيتحسب على أساس السبريد إلي موجود هنا
الملف المرفق 329797
ولو كان السبريد بيتجاب من ملفات الهيستوري ياترى في طريقة أعمله ثابت بمقدار معين فرضا 0 أو 0.00001
وشكرا :eh_s(7):
شكرا جزيلا ، الآن يعمل بشكل صحيح .
بعد التعديل النتائج اصبحت أفضل قليلا ، ولكن ظهر خطـأ جديد مع عدم عمل مودفاى للأوردر
https://forum.arabictrader.com/attac...4&d=1341352534كود PHP:Modify error :130
https://forum.arabictrader.com/attac...3&d=1341352534
الداله
تعود بقيمة البيانات المدرجه في نافذة Market Watch فالإكسبرت يجلب من هذه النافذه ولو لاحظت عند عمل باك تست سوف تجد خانة Symbol properties لو ضغطت عليها سوف تجد جميع بيانات العمله التي ستعمل لها الباك تست ومنها الإسبريدكود PHP:MarketInfo( string symbol, int type)
يمكن تغيير الإسبريد في الميتاتريدر وبما أنك ذكرت السؤال فسوف أشرحها في موضوع مستقل
قد يكون السبب في أن الهدف والأستوب قليل في بعض العملات فحسب ما تقول أغلب المشكله مع الباوند ين فربما السبب لأن الإسبريد لها كبير بالتالي الهدف والاستوب 10 نقاط تعتبر قليله فيظهر هذا خطأ قم بزيادة الهدف والأستوب قليلا وقم بإستخدام الداله NormalizeDouble لتعديل نقاط الهدف والأستوب لوز
شكرا جزيلا أخي أسامه تم التعديل و الإكسبيرت يضع الأوامر الآن و لكن لاحظت ان الإكسبيرت يضع فقط الباي ستوب و لا يضع السيل ستوب و عندما أقوم بإلغاء تفعيل الباي ستوب أو مسح شروط الباي ستوب أجده يضع السيل ستوب ... و لا يضع الإثنان معا لا اعلم لماذا ؟؟
أيضا لاحظت تأخر الإكسبيرت حتى يتفعل لمده تصل خمس دقائق ..
رجاء الإطلاع
و بارك الله فيك
الإكســــــــــــــــــبيرت
استاذ اسامة ، الاكسيبرت المرفق بعد إضافة مضاعفات فيبوناتشي ظهرت مشكلة بسيطة ، وهى انه بعد فتح صفقة رابحة وبعدها صفقة خاسرة الصفقة التى تليها يتم حساب المضاعفات لها بطريقة خطـأ ، وانا أريد ان يبدأ فـ فتح صفقات المضاعفات مرة أخرى بنفس الطريقة 1-2-3-5-8-13-21-34-55-89 وذلك بعد آخر صفقة أغلقت على خسارة ، مرفق صورة للتوضيح .
هذا لأنك وضعت الشرط
فبالتالي عندما يضع الأمر المعلق الأول وعند المقارنه مره أخرى مع الأمر الثاني فلن يتحقق هذا الشرط بالتالي لن يضعهكود PHP:MyBuyPendingOrdersTotal(MagicNumber)==0
إجعل شروط أوامر البيع والشراء المعلقه في جملة شرطيه واحده
مثال :
كود PHP:if (MyBuyPendingOrdersTotal(MagicNumber)==0 && Time0!=Time[0]) {
if((TimeCurrent()-LastClosedOrderTime())/60/60>=99999){
if(StopLoss==0||HideSL){SL=0;}else{SL=Ask-StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Ask+TakeProfit*point;}
if(UseRecTP)TP=(buy+TP_R);
if(UseRecSL)SL=(buy-SL_R);
if(USE_BUYSTOP==TRUE) OrderSend(Symbol(),OP_BUYSTOP,Lots1,NormalizeDouble(buy,Digits),3,SL,TP,"first",MagicNumber,0,Green);
////////
if(StopLoss==0||HideSL){SL=0;}else{SL=Bid+StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Bid-TakeProfit*point;}
if(UseRecTP)TP=(sell-TP_R);
if(UseRecSL)SL=(sell+SL_R);
if(USE_SELLSTOP==TRUE) OrderSend(Symbol(),OP_SELLSTOP,Lots1,NormalizeDouble(sell,Digits),3,SL,TP,"first" ,MagicNumber,0,Green);
PlaySound("Alert.wav");
Time0=Time[0];
}
}
استاذ اسامة ، كيف اضيف خاصية الـ UseMoneyManagement للاكسيبرت المرفق
السبب في الآتي
المفروض في أول صفقه خاسره مثلا 1 لوت فالمضاعفه الأولى تكون 1 لوت أيضا ثم المضاعفه الثانيه يتم جميع آخر صفقتين وهكذا
لذلك يجب أن تضيف شرط إذا كانت أول صفقه خاسره فحجم اللوت سيكون نفسه
يمكنك عمل داله لحساب عدد الصفقات الخاسره المتتاليه
ثم ستضيف شرطكود PHP:int NumberOfLosses(){
int N;
for(int i=OrdersHistoryTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){
if(OrderProfit()>0){
return(N);
}
else{
N++;
}
}
}
return(N);
}
كود PHP:if(WinorLoss()==false){
if(NumberOfLosses()==1)Lots=LastLot(MagicNumber,1);
else {Lots=LastLot(MagicNumber,1)+LastLot(MagicNumber,2);}
}
قمت بإضافة الخاصية للاكسيبرت ولكن وجدت الكود كتب بشكل مختلف فـ اكسيبرت آخر .
دالة LotManage()
وتم تعريف الـكود PHP:double LotManage(){
double lot = MathCeil(AccountBalance() * RiskPercent / 1000) / 100;
if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Symbol(),MODE_MINLOT);
if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Symbol(),MODE_MAXLOT);
return (NormalizeDouble(lot,Lot_Digits));
}
لماذا تم وضع Lot_Digits مع الـ lot فـ أمر الـ returnكود PHP:extern int Lot_Digits=2;
استاذ اسامة انا اريد كود يقوم بمضاعفة الصفقات المفتوحة فـ حالة خسارتها ، اى اذا كانت أخر صفقة مفتوحة بيع أو شراء البروفت لها سالب يقوم بمضاعفة العقد التالى .
انا استخدمت من قبل هذا الكود لعمل ذلك
وقمت بتعريف دوالكود PHP:if(profit(OP_BUY)<0 ||profit(OP_SELL)<0 && Use_Mult==true){Lots=lastlot2()*Multiplier;}
else {Lots=Firstlot;}
كود PHP:double profit(int type)
{
double pr;
for(int i =0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()&& type==OrderType()){
pr=OrderProfit(); // Profit For last opened Trade olny , If ALL opened Trades Use pr=pr+OrderProfit(); //
}
}
return(pr);
}
كود PHP:double lastlot2(){
for(int i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){
double lotsnumber=OrderLots();
}
}
return(lotsnumber);
}
وتعريف متغير خارجى
كود PHP:extern bool Use_Mult=false;
ولكن الغريب ان الاكسيبرت لايفتح العقود بإستخدام خاصية MoneyManagement مع وجود هذا الشرط فـ الاكسيبرت وعند حذفه تعمل الخاصية !!
حاول يا محمد تجمع أكواد الإكسبيرت شوية منعا للخبطة
يعني مثلا شروط تحديد اللوت إنت عامل شوية في شروط البيع والشراء وشوية في إستارت
حاول تجمعهم عشان الإكسبيرت كده بيعدي على أول شرط مثلا MoneyManagement ويقوم محدد اللوت على أساس رأس المال وبعد كده بيعدي على شرط تحديد اللوت حسب ربح أخر صفقة ولو أخر صفقة خسرانة بيغير حجم اللوت وبعد كده بيدخل على شروط البيع والشراء يلاقي شروط تانية لتحديد قيمة اللوت
حاول تجمعهم في شرط واحد في إستارت بحيث تكون عارف مع كل حالة اللوت النهائي هيكون إية بإستخدام if و else if
يعني مثلا بالشكل ده
وطبعا إنت تعدل في الكود لإن ده مجرد مثالكود PHP:if(profit()<0 && Use_Mult==true){Lots=lastlot2()*Multiplier;}
else if(profit()>0 && UseMoneyManagement==true){Lots=LotManage();}
else if(UseMultiplier&& WinorLoss()==false){Lots=lastlot()*Multiplier;}
ورتب الشروط بحيث ما يكونش في تضارب بينها
--------------
التضارب عندك في إنك إستخدمت
وبما إن الإكسبيرت يقرأ من فوق لتحت فإنه يمر على شرط UseMoneyManagement ويحدد اللوتكود PHP:else {Lots=Firstlot;}
ولو الصفقة الأخيرة رابحة أو Use_Mult==false فإنه سيمر على شرطويقوم بتغير اللوت مرة أخرىكود PHP:else {Lots=Firstlot;}