رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
كود إدارة رأس المال غير صحيح
فعند عمل الداله الأمر return الأول فقط هو الذي سيتفعل وباقي الكود كأن ليس له وجود
فلو راجعت تعريف الأمر return فهو ينهي الداله ويعود بالقيمه المحدده بالتالي عندما يكون عند أول أمر return سوف ينفذه ولن ينفذ باقي الأوامر
لحل هذه المشكله يمكنك تعديل الكود
كود PHP:
double LotManage(double riskpercent)
{
double lot = MathCeil(AccountFreeMargin() * riskpercent / 1000) / 100 ;
if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot1=MarketInfo(Symbol(),MODE_MINLOT);
if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot1=MarketInfo(Symbol(),MODE_MAXLOT);
return (MathMin(lot,200));
}
ثم في الأمر الأول سوف تستخدم الداله
كود PHP:
LotManage(RiskPercent1);
والأمر الثاني
كود PHP:
LotManage(RiskPercent2);
وهكذا
وبنفس الطريقه يمكنك تعديل التريلينج ستوب بأن تجعل قيمة TrailingStop والماجيك نمبر كمتغير خاص بالداله ثم تستخدم الداله أكثر من مره على حسب عدد الماجيك نمبر عندك
وهل كنت تقصد في المشاركه السابقه ان ادمجهم هكذا اولا اضع داخل داله البدايه
كود PHP:
LotManage(RiskPercent1);
LotManage(RiskPercent2);
LotManage(RiskPercent3);
LotManage(RiskPercent4);
ثم كود الاداره راس المال هكذا
كود PHP:
double LotManage(double riskpercent)
{
double lot = MathCeil(AccountFreeMargin() * 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 (MathMin(lot,200));
}
اما بالنسبه لكود راس المال سيكون داخل داله البدايه
كود PHP:
MoveTrailingStop( TrailingStop1);
MoveTrailingStop( TrailingStop2);
MoveTrailingStop( TrailingStop3);
MoveTrailingStop( TrailingStop4);
ثم الكود
كود PHP:
double MoveTrailingStop(double TrailingStop)
{
double TrailingStep;
int cnt,total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol()&&(OrderMagicNumber()==Magicnumber1||OrderMagicNumber()==Magicnumber2
||OrderMagicNumber()==Magicnumber3||OrderMagicNumber()==Magicnumber4))
{
if(OrderType()==OP_BUY)
{
if(TrailingStop>0&&NormalizeDouble(Ask-TrailingStep*point,Digits)>NormalizeDouble(OrderOpenPrice()+TrailingStop*point,Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-TrailingStop*point,Digits))||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*point,Digits),OrderTakeProfit(),0,Blue);
return(0);
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+TrailingStep*point,digits)<NormalizeDouble(OrderOpenPrice()-TrailingStop*point,Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+TrailingStop*point,Digits)))||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*point,Digits),OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
ولكن كيف سيعرف الاكسبيرت اني اريد ان يتاجر 1% لBUY-STOP و 3% ل sell-limit و5% ل sell-stop وهكذا بالنسبه لكود الاستوب االمتحرك كيف سبتعرف على trailingstep لكل امر.
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
تم إضافة التعديل على الإكسبرت
راجع الكود جيدا والتعديل الذي تم فيه
الله يبارك فيك ويجعل علمك كما قال النبي او علم ينتفع به.
بعد التدقيق في التعديل لدي بعض ملاحظات.
الملاحظه الاولى
يرجى التعديل على الاكسبيرت لانه يقوم بحذف الامر المعلق الاخر بمجرد تفعيل الاول ..لكن انا قلت يجب ان تبقى الاوامر المعلقه ختى نهايه الاسبوع وان تفعل الامر الاول.
الملاحظه الثانيه.
كيف اجعل الكود يصل الى المضاعفه الرابعه لكل امر كحد اقصى؟
وماذا تقصد بالرقم 2 في اخر هذا الكود هل عدد المضاعفات ام ماذا؟
كود PHP:
int LastOrdertype(){
for(int i=OrdersTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
int t=OrderType();
if(OrderMagicNumber()==Magicnumber||OrderMagicNumber()==Magicnumber1||OrderMagicNumber()==Magicnumber2&&OrderSymbol()==Symbol()&&OrderType()<=OP_SELL){
return(t);
}
}
return(2);
}
الملاحظه الثالثه
وجدت بعض الاوامر في الاكسيبيرت فهل ترجمتي لهذ الاوامر صحيحه؟
كود PHP:
if(MyPendingOrdersTotal(Magicnumber)==1)DeletePendingOrders(Magicnumber);
اذاكان عدد الاوامر المعلقه ل الماجيك نمبر تحقق الواحد فحذف الامر المعلقه لهذا الماجيك نمبر.
ولماذا لم تكتبه بهذا الشكل
كود PHP:
if(MyPendingOrdersTotal(Magicnumber)==1){ DeletePendingOrders(Magicnumber);}
الترجمه الثانيه
كود PHP:
OrderType()<=OP_SELL
اذا كان نوع الصفقه اقل او يساوي بيع ....لكن اشعر ان الترجمه هكذا خطاء.
لكن ان كان مكتوب هكذا OrderType()==OP_SELL
هذا معناه اذاكانت الصفقه بيع سواء LIMIT OR STOP
الملاحظه الاخيره
اي الاكواد التي يتم التعديل فيها حسب نوع المضاعفه هل مو كود نوع اخر صفقه او حجم اخر صفقه او عدد الاوامر المعلقه؟
مثال اريد الدخول بعقد شراء وبيع من نقطه ما.... يعني هيدج
وبمجرد ان يصل كلاهما الى 50 نقطه نقفل الربح ويظل الخساره وبنفس اللاحظه نفتح عقدين من نفس نوع العقد المغلق فاذاو صلوا مره اخرى 50نقظه
تقفل الجميع............اما اذا عكسوا ووصلوا الى خساره 50 نقطه نقوم بفتح عقد اخر عكس نوعهم...فاذا واصلوا القدين في الخساره 50 نقطه اضافيه
يقفل الجميع.............ان شاء الله الفكره واضحه
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
الأخوة المبرمجين :
السلام عليكم ورحمة الله وبركاته ...
أرفق إليكم هذا الملف ، المتضمن لإكسبرت ناسخ للصفقات ، ومفتوح المصدر .
وأمل منكم التكرم بالاجابة على هذه الاسئلة :
1 - هل هذا الأكسبرت يعمل بصورة جيدة أم لا ؟ وماهي أفضل طريقة لتشغيله ؟
2 - ماهي عيوب ومميزات هذا الاكسبرت ؟
3 - هل يمكن إستخدام متغير على هيئة مصفوفة ، بدلاً عن الملف المشترك بين الماستر والسليف ، وذلك عن طريق المكتبة Kernel.dll ؟ وكيف ذلك إذا أمكن ؟
وأحسن الله عملكم وبارك فيكم ، ووفقكم لما يرضيه ويرضيكم .
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
الأخوة المبرمجين
السلام عليكم ورحمة الله وبركاته
أرفق إليكم هذا الملف ، المتضمن لإكسبرت ناسخ للصفقات ، ومفتوح المصدر .
وأمل منكم التكرم بالاجابة على هذه الاسئلة :
1 - هل هذا الأكسبرت يعمل بصورة جيدة أم لا ؟ وماهي أفضل طريقة لتشغيله ؟
2 - ماهي عيوب ومميزات هذا الاكسبرت ؟
3 - هل يمكن إستخدام متغير على هيئة مصفوفة في هذا الاكسبرت ، بدلاً من الملف المشترك بين الماستر والسليف ، وذلك عن طريق المكتبة Kernel.dll أو غيرها ؟ وكيف ذلك إذا أمكن ؟
وأحسن الله عملكم وبارك فيكم ، ووفقكم لما يرضيه ويرضيكم .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
بالنسبه للنقطة الأولى
في هذه الحاله قد تواجه مشكلة إذا تفعل الصفقتين معا فيجب أن تحدد كيف ستتم المضاعفات
أنا جعلت حذف الأمر المعلق الآخر حتى إذا بدأ الدخول في سلسلة المضاعفات يكون إغلاق الصفقات بشكل صحيح
بالنسبه للداله LastOrderType فهي تعود بالرقم 0 إذا كانت الصفقه شراء والرقم 1 إذا كانت الصفقه بيع
أما ستعود بالرقم 2 إذا لم تكون الصفقه شراء أو بيع ممكن إستبداله بأي رقم آخر المهم حتى أميز نوع الصفقه
بالنسبه للملاحظه الثالثه فسواء وضعت الأقواس {} أو لم تضعها فلن تختلف النتيجه لأن جسد الشرط أو الأمر الذي سينفذ هو أمر واحد أما إذا كان أكثر من أمر فيجب أن تضع الأوامر بداخل الأقواس
الترجمه الثانيه إذا كانت نوع الصفقه أقل من OP_SELL أي أنها ستكون OP_SELL أو OP_BUY
لأن أمر البيع يأخذ الرقم 1 والشراء يأخذ الرقم 0
فإذا قلت أقل من أو تساوي OP_SELL فهذا يعني أنني أقصد رقم 0 و 1 أي البيع والشراء
سوف تضع أوامر الهيدج مع أوامر المضاعفات وسوف تستخدم الداله LastOrderPrice لتحديد فرق النقاط بين آخر صفقه تم فتحها وبين السعر الحالي لتحديد عدد النقاط التي تريد فتح الهيدج عندها
كود PHP:
كما قلت الفكره هوفتح اوامر معلقه يوميا عند فتح الساعه 17 ولاتقفل ولا تحذف هذه الاوامر الا نهايه الاسبوع فاذا تفعل امر ما يقوم كود المضاعفات بفتح عقود معاكسه مضاعفه و ان تبقى ايضا الى نهايه الاسبوع فاذا تفعلت هذه العقود المعاكسه يقوم كوذ المضاعفات مره اخرى بفتح عقود معاكسه مضاعفه وهكذا يبقى يضاعف الى ان يصل الى المضاعفه الثالثه او الرابعه او الخامسه حسب تغيرالضبط اوالتحكم في اقصى عدد للمضاعفات.
مثال حتى تتضح الفكره......انا يوميا اقوم بعمل امرين معلقين من نوع BUY-STOP و SELL-STOP ولا احذفهم ولا اغلقهم مهما كان الامر الا نهايه الاسبوع.
بمجرد ان يتفعل احد الامرين كما قلت لا نحذف الامر الاخر ولكن اقوم بفتح امرين معلقان معاكسين للامر الذي تفعل على بعد عدد ما من النقاظ فان وصل الامر الى هذيين الامرين وتفعلا اقوم مره
اخرى بفتح ثلاته اوامر معلقه عكس الامرين المعلقيين الاوليين وهذه تكون اخر مضاعفه حتى وان تحرك السعر ضدي لا يقوم بالمضاعفه يعني يصل الى المضاعفه الثالثه فقط...وزهكذ بالنسبه للاا مر
المعلق الاخر الذي فتحته اول مره.ان شاء الله الفكره وضحت
السوال الثاني كيف سيكون الشرط عندما اقول اذا تفعل الامرين المعاكسين للامر الاول وتحرك السعر فوقهما ب 50 نقطه او 50 نقطه تحتهما اغلق جميع الاوامر.
يمكن تعطيني كود LastOrderPrice.