بارك الله فيك MR.dollar شرح ممتاز وواضح
متابعين معك :0031:
-- شكرا --
Printable View
بارك الله فيك MR.dollar شرح ممتاز وواضح
متابعين معك :0031:
-- شكرا --
اخى Mr.dollar
لم تترك لنا نقطه واحده نسال فيها كل شرحك سهل وبسيط وواضح بارك الله فيك
شرح لطريقة عمل اكسبرت لمؤشر مهم نشكرالأستاذ mr dollar على كل مايقدمه لأخوانه لوجه الله تعالى
وسؤالي هل يوجد اكسبرت حاليا جاهز يقوم بتنفيذ طريقة الأستاذ take points اعلاه ام ننتظر وسيشمل الدرس هذه النقطة...
ولكم فائق التحية والسلام وجزاكم الله خيرا ...
استفدنا من شرحك الكثيرعن كيفية برمجة اكسبرت الباربوليك سار الرائع والجذاب والذي كان ينقصه لمساتك المبدعة لدمجه مع مؤشرات قوية كالاستوكاستك ليصبح إستراتيجية متكاملة مصيرها النجاح بإذن الله ...
لاادري مابوسعي قوله إلا جزاك الله الف خير وطاب مساؤك أستاذنا ... :eh_s(7):
بانتظار وعد اضافه المضاعفات عند الامكان ..مع التحيه
سنعمل الآن على إضافة المضاعفات
كما هو معروف يوجد نوعين من المضاعفات المضاعفات العكسيه أوالمضاعفات في نفس الإتجاه
الطريقه متشابه في جميع الحالات وتعتمد في الأساس على البحث عن سعر إفتتاح آخر صفقه فإذا كانت الصفقه بيع وكان السعر الحالي أكبر من سعر فتح الصفقه الأخيره+ المسافه بين المضاعفات والتي تم تحديدها نقوم بمعرفة حجم آخر لوت في الصفقه ونقوم بضربه في طريقة المضاعفات التي نريدها
سوف نقوم أولا بتعريف المتغيرات الخارجيه للتحكم في المضاعفات في الإكسبرت
الكود بشكل كامل سيكون كالآتيكود PHP:extern bool UseMultiplier=true;
extern double Multiplier=2;
extern int Step=20;
نأتي الآن لشرح الكودكود PHP:double openprice,lots,newLot;int s;
if(UseMultiplier){
for(s=0;s<OrdersTotal();s++){
OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==OP_BUY){
openprice=OrderOpenPrice();lots=OrderLots();
}
}{
newLot=Multiplier*lots;
if(Ask<=openprice-Step*point&&orderstotal()>=1){
if(TakeProfit==0){TP=0;}else{TP=Ask+TakeProfit*point;}
OrderSend(Symbol(),OP_BUY,newLot,NormalizeDouble(Ask,digits),3,0,TP,"MR.dollar EA",MagicNumber,0,Blue);
}
}
for(s=0;s<OrdersTotal();s++){
OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==OP_SELL){
openprice=OrderOpenPrice(); lots=OrderLots();
}
}{
newLot=Multiplier*lots;
if(Bid>=openprice+Step*point&&orderstotal()>=1){
if(TakeProfit==0){TP=0;}else{TP=Bid-TakeProfit*point;}
OrderSend(Symbol(),OP_SELL,newLot,NormalizeDouble(Bid,digits),3,0,TP,"MR.dollar EA",MagicNumber,0,Red);
}
}
}
بداية قمنا بإستخدام الحلقه for للبحث عن آخر صفقه تم فتحها بواسطة الإكسبرت وكانت صفقة شراء ثم قمنا بتحديد الصفقه بإستخدام الأمر OrderSelectكود PHP:for(s=0;s<OrdersTotal();s++){
OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==OP_BUY){
openprice=OrderOpenPrice();lots=OrderLots();
ويتم تعريف الأمر كالآتي
حيثكود PHP:OrderSelect( int index, int select, int pool=MODE_TRADES);
index رقم الصفقه أو رقم التيكيت للصفقه فنحن هنا قمن بإستخدام رقم الصفقه وهو المتغير s في الحلقه التي قمنا بتعريفها
select طريقة إختيار الصفقه إما SELECT_BY_POS أو SELECT_BY_TICKET
pool إما أن تكون MODE_TRADES وهي للصفقات المفعله أو MODE_HISTORY وهي للصفقات المغلقه أو الأوامر المعلقه المحذوفه
ثم قمنا بتعريف المتغيرات lots و openprice وأعطيناها القيم التاليه
حيث OrderOpenPrice هو سعر فتح الصفقه التي تم إختيارها و OrderLots هو حجم لوت الصفقه التي تم إختيارهاكود PHP:openprice=OrderOpenPrice();lots=OrderLots();
الجزء الثاني من الكود
قمنا بتعريف المتغير newLot وهو حجم اللوت الجديد وسيأخذ قيمة لوت آخر صفقهكود PHP:newLot=Multiplier*lots;
if(Ask<=openprice-Step*point&&orderstotal()>=1){
if(TakeProfit==0){TP=0;}else{TP=Ask+TakeProfit*point;}
OrderSend(Symbol(),OP_BUY,newLot,NormalizeDouble(Ask,digits),3,0,TP,"MR.dollar EA",MagicNumber,0,Blue);
مضروبا في Multiplier وهو نوع المضاعفات التي قمنا بتعريفها في متغيرات الإكسبرت الخارجيه
ثم شرط الدخول في الصفقه
إذا كان السعر الحالي أقل من سعر فتح الصفقه - المسافه التي قمنا بتحديدها في متغيرات الإكسبرت يتم الدخول في الصفقه هذا بالنسبه للشراء أما بالنسبه للبيع فسيكون سرع فتح الصفقه + المسافه التي قمنا بتحديدها في متغيرات الإكسبرتكود PHP:if(Ask<=openprice-Step*point&&orderstotal()>=1){
بما أننا أضفنا كود المضاعفات فسوف نضيف أيضا متغير لإغلاق جميع الصفقات عند وصول الربح إلى مبلغ معين
بداية سنقوم بتعريف داله لحساب الربح الحالي للصفقات المفتوحه بواسطة الإكسبرت
ثم سنضع شروط غلق الصفقهكود PHP:double profit(){
double c;
for(int i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
c=c+OrderProfit();
}
}
return(c);
}
كود PHP:if(profit()>=ProfitTarget){
while(orderstotal()>0){CloseSellOrders();CloseBuyOrders();}
}
سنقوم الآن بإضافة دالة إخفاء الهدف والأستوب لوز
كود PHP:int CloseBuyOrdersHiddenTP()
{
int total=OrdersTotal();
for (int cnt=total;cnt>=0;cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY&&Bid>(OrderOpenPrice()+TakeProfit*point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
}
}
return(0);
}
(OrderTicket(),OrderLots(),Ask,3);كود PHP:int CloseSellOrdersHiddenTP()
{
int total=OrdersTotal();
for(int cnt=total;cnt>=0;cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL&&Ask<(OrderOpenPrice()-TakeProfit*point))
{
[PHP]OrderClose
}
}
}
return(0);
}[/PHP]
سنعتمد أيضا على الداله for للبحث عن الصفقات المفتوحه بواسطة الإكسبرت ثم نضع من ضمن الشروط ثم نضع من ضمن الشروط إذا كان السعر الحالي أكبر من سعر الدخول أو أقل من سعر الدخول يتم إغلاق الصفقه وسنستخدم الأمر
على سبيل المثال بالنسبه للبيعكود PHP:OrderClose
سوف نضع في متغيرات الإكسبرت الخارجيه خاصية إمكانية تفعيل أو تعطيل الهدف والأستوب لوزكود PHP:Ask<(OrderOpenPrice()-TakeProfit*point
كود PHP:extern bool HideSL=false;
ثم سنضع قبل الأمر OrderSendكود PHP:extern bool HideTP=false;
كود PHP:if(StopLoss==0||HideSL==true){SL=0;}else{SL=Ask-StopLoss*Point;}
if(TakeProfit==0||HideTP==true){TP=0;}else{TP=Ask+TakeProfit*Point;}
بحيث إذا كان الخيار HideTP قمنا بتفعيله فسوف نجعل TP=0 وأيضا بالنسبه للأستوبكود PHP:if(StopLoss==0||HideSL==true){SL=0;}else{SL=Bid+StopLoss*Point;}
if(TakeProfit==0||HideTP==true){TP=0;}else{TP=Bid-TakeProfit*Point;}
أخيرا الإكسبرت في المرفقات
بارك الله فيك على المجهود بالشرح الوافي للاكسبرت ....
أستاذي Mr. Dollar :
عند وضع step = 23 يظهر لنا في الباك تست بعد فترة خطأ كما هو ظاهر بالصورة المرفقة.
مع أنه النتائج بهذا الرقم كانت ممتازة لكن توقف الباكتست غريب ... مع خالص الشكر :eh_s(7):
الزوج صاحب الاختبار هو الدولار ين
النتائج لحظة التوقف
rقد يحدث هذا الخطأ بسبب بعض البيانات التاريخية ونلاحظ أن الإكسبرت يبحث عن سعر الفواصل العشرية فيه كثيره فبالتالي يظهر الخطأ
لحل هذه المشكلة نستخدم الداله NormalizeDouble
وهي تقوم بتحديد عدد الأرقام العشرية التي تريدها بعد الفاصله وسوف نستخدم مع سعر فتح الصفقه وسعر إغلاق الصفقه
وتعريفها كالآتي
حيثكود PHP:double NormalizeDouble( double value, int digits)
value هي القيمة التي تريد تقريبها
digits هي عدد الأرقام بعد الفاصله التي تريدها
وسوف نستخدم الكلمة Digit حتى تبين لنا عدد الأرقام العشريه الطبيعي بعد الفاصله فمثلا اليورو دولار يحتوي على أربع أرقام بعد الفاصله والدولار ين يحتوي على رقمين بعد الفاصله
ثم نقوم مثلا في أمر البيع نضع الكود بالشكل التالي
وكذلك بالنسبة لباقي الأوامركود PHP:OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,digits),3,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),"MR.dollar EA",MagicNumber,0,Red);
الإكسبرت في المرفقات
مستر دولار
الصراحة شرح ولا اروع. يعطيك العافية على المجهود الممتاز و الشرح الواضح
سابقى من المتابعين و المتعلمين انشالله
شكرا جزيلا مستر دولار
حصيله 6 ساعات عمل اكتر من 60%