النتائج 1 إلى 15 من 19
- 31-01-2016, 11:05 PM #1
الهدف والأستوب و التريلينج ستوب المخفي في الإكسبرت
في هذا الموضوع التعليمي سأقوم بشرح عدة أفكار برمجية لكيفية إستخدام الهدف والأستوب لوز و التريلينج ستوب بأنواعه بحيث تكون غير ظاهره للبروكر لكن يتم إغلاق الصفقات عندما تصبح الصفقه إلى نقطة الهدف وهذا الموضوع مهم جدا خصوصا لكن يستخدم الإسكالبينج بحيث لا يقبل البروكر عدد نقاط صغيرة كهدف أو ستوب لوز وأيضا لمن يستخدم التريلينج ستوب لمجموعة من الصفقات معا وليس لكل صفقة على حده.
الفكرة بشكل عام هي أن تخبر الإكسبرت عندما يصل السعر إلى نقطة معينه قمت بتحديدها سابقا والتي هي نقطة خروج الصفقه فسيقوم الإكسبرت بإغلاق الصفقه بدلا من أن تغلق بنفسها على السعر المحدد في الهدف أو الاستوب لوز
1- سنبدأ أولا بأبسط جزء وهو كيف تحدد الهدف المخفي
الفكره هي عمل دالة للبحث عن الصفقات المفتوحه ثم يضع شروط إغلاق الصفقه بالنسبه للشراء إذا كان السعر الحالي أكبر من ( سعر فتح الصفقة + عدد نقاط الهدف المخفي ) فيتم إغلاق الصفقه
بالنسبه للبيع إذا كان السعر الحالي أقل من ( سعر فتح الصفقه - عدد نقاط الهدف المخفي ) فيتم إغلاق الصفقه
مثال
كود PHP:void CloseOrdersHiddenTP()
{
for (int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY&&Bid>=OrderOpenPrice()+HiddenTP*Point)
{
bool closeB=OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
if(OrderType()==OP_SELL&&Ask<=OrderOpenPrice()-HiddenTP*Point)
{
bool closeS=OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
}
}
}
2- تحدد الأستوب المخفي
بنفس الفكرة الإغلاق على الأستوب لوز
كود PHP:void CloseOrdersHiddenSL()
{
for (int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY&&Bid<=OrderOpenPrice()-HiddenSL*Point)
{
bool closeB=OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
if(OrderType()==OP_SELL&&Ask>=OrderOpenPrice()+HiddenSL*Point)
{
bool closeS=OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
}
}
}
الفرق بين الهدف والتريلينج ستوب أنه في التريلينج ستوب لا يوجد سعر ثابت سيغلق عنده السعر فكيف نحل هذه المشكله
الفكره في تعريف متغير لكل صفقة جديده يتم فتحها وتكون مرتبطه بالصفقه وكلما تحرك التريلينج ستوب سوف تتغير قيمة هذا المتغير وبمجرد أن يصل السعر إلى قيمة هذا المتغير سوف تغلق الصفقه على التريلينج ستوب
مثال دالة تستخدم المتغيرات العامه GlobalVariables لحذف قيمة التريلينج ستوب
كود PHP:void HiddenTrailingStop()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL&&HiddenTS>0)
{
if(OrderType()==OP_BUY)
{
if(Bid>=OrderOpenPrice()+HiddenTS*Point&&(GlobalVariableGet("TS"+OrderTicket())<Bid-HiddenTS*Point||GlobalVariableGet("TS"+OrderTicket())==0))
{
GlobalVariableSet("TS"+OrderTicket(),Bid-HiddenTS*Point);
}
}
else
{
if(Ask<=OrderOpenPrice()-HiddenTS*Point&&(GlobalVariableGet("TS"+OrderTicket())>Ask+HiddenTS*Point||GlobalVariableGet("TS"+OrderTicket())==0))
{
GlobalVariableSet("TS"+OrderTicket(),Ask+HiddenTS*Point);
}
}
}
}
}
مثال
كود PHP:void CloseHiddenTrailingStop()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY&&GlobalVariableGet("TS"+OrderTicket())!=0)
{
if(Bid<=GlobalVariableGet("TS"+OrderTicket()))
{
bool closeB=OrderClose(OrderTicket(),OrderLots(),Bid,3);
GlobalVariableDel("TS"+OrderTicket());
}
}
if(OrderType()==OP_SELL&&GlobalVariableGet("TS"+OrderTicket())!=0)
{
if(Ask>=GlobalVariableGet("TS"+OrderTicket()))
{
bool closeS=OrderClose(OrderTicket(),OrderLots(),Ask,3);
GlobalVariableDel("TS"+OrderTicket());
}
}
}
}
}
لنفرض أننا نريد حساب التريلينج ستوب بناء على النسبة المئويه للربح من الحساب مثلا عندما يصل الحساب إلى ربح 5% يتم تقديم التريلينج المخفي إلى ربح 1% وعندما يصل الربح إلى 6% يتم تقديم التريلينج إلى 2%
وهكذا حتى يتراجع الربح وتغلق الصفقات جميعها على النسبة المئويه للتريلينج
نفس الفكره السابقه لكن بدلا من حساب النقاط سنحسب النسبة المئويه
مثال
كود PHP:void HiddenTrailingBalancePercent()
{
double ProfitPercent=AccountProfit()/AccountBalance()*100;
if(ProfitPercent>=StartTrailingPercent&&(GlobalVariableGet("TS Percent")<ProfitPercent-StartTrailingPercent||GlobalVariableGet("TS Percent")==0))
{
GlobalVariableSet("TS Percent",ProfitPercent-StartTrailingPercent);
}
if(ProfitPercent<=GlobalVariableGet("TS Percent")&&GlobalVariableGet("TS Percent")!=0)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
bool closeB=OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
if(OrderType()==OP_SELL)
{
bool closeS=OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
}
GlobalVariableDel("TS Percent");
}
}
- 02-02-2016, 11:59 AM #2
نتعلم من بحر علم كل يوم جديد
لك الشكر والتقدير استاذى الكريم مستر دولار
- 02-02-2016, 10:51 PM #3
جزاك الله خيرا على الدرس الجميل
ودائما سباق بالخير
عزيزي
هل ممكن شرح لـ MODE_TRADES
----
وعندي سؤال آخر
ايهما اسرع للاسكربت
تكرار حلقات for كما فعلت اعلاه
أم اختصارها ودمجها في حلقة واحدة أو أقل عدد ممكن
.... بصراحة اكره الحلقات والسليب
- 02-02-2016, 11:07 PM #4
بارك الله فيك استاذي مستر دولار
- 03-02-2016, 02:36 PM #5
في الدالة OrderSelect يمكنك البحث عن الصفقات المفتوحه أو الصفقات المغلقه
إذا كنت تبحث عن الصفقات المفتوحه تستخدم MODE_TRADES وإذا كنت تبحث عن الصفقات المغلقه تستخدم MODE_HISTORY
بالتأكيد كلما قللت عدد الحلقات فهو أفضل وأسرع للإكسبرت, لكن أيضا راعي أن يكون الكود واضح في حال أردت مراجعته لاحقا أو تعديله ولهذا السبب أن إستخدمت أكثر من دالة وأكثر من حلقه للبحث
- 04-02-2016, 02:59 AM #6
- 06-02-2016, 12:55 AM #7
ابداع في ابداع
شكرا جزيلا استاذ اسامه
جزاك الله خير
- 06-02-2016, 01:12 AM #8
- 12-02-2016, 03:48 PM #9
سؤال أخير تكرما
ما هو كود وضع التريلينج للاوامر المعلقة
- 12-02-2016, 04:25 PM #10
ما شاء الله أخي الكريم ...
عمل متقن وكود احترافي ...
بالنسبة لي فأنا أستخدم فكرة أخرى للهدف والوقف المخفي ... وأيضا التريلينج ستوب .
الفكرة باختصار هي تعريف قيمة افتراضية وهمية أكبر بعدة مرات من هدفنا أو وقفنا الحقيقي ...
مثلا هدفنا 5 نقاط فقط ... نقوم بتعريف الهدف الافتراضي 50 نقطة ..
نعدل الهدف لهذه الصفقة ليكون 55 نقطة من سعر الافتتاح .
والأن بمجرد أن يصبح الفرق بين السعر الحالي والهدف الوهمي أقل من 50 ... يتم إغلاق الصفقة .
وأيضا نفس الأمر بالنسبة للوقف .
بالنسبة للتريلينج ستوب يتم تعديل الوقف الإفتراضي كلما مشت الصفقة لصالحنا ... ويتعامل معه الاكسبيرت بطرح قيمة الوقف الإفتراضي ... وبمجرد أن تقل القيمة عنه يقفل الصفقة .
ما الذي استفدناه من هذه الفكرة ...
نحن خزنا معلومات الوقف والهدف والتريلينج في نفس الصفقات ... ولم نعد بحاجة إلى تخزين هذه المعطيات في متحولات خارجية .
وبمجرد تشغيل الاكسبيرت في أي وقت سيعرف تماما ما عليه أن يفعل .. بناء على المعطيات المخزنة أصلا في الصفقات ...
فائدة أخرى هنا ... وهي وجود وقف وهدف حقيقي في السيرفر ... نضمن تنفيذه في السيرفر ... في حال حدوث مشاكل في الاتصال أو في السيرفر نفسه .
- 14-02-2016, 06:56 PM #11
السلام عليكم استاذى الكريم
ماهو الخطا الموجود هنا
ولك الشكر والتقدير على المساعده
تحياتى لك
كود PHP:void MoveTrailingStop()
{
if(TrailingStop<MarketInfo(Symbol(),MODE_STOPLEVEL)){TrailingStop=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);}
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
if(TrailingStop>0&&NormalizeDouble(Ask-TrailingStep*pt,Digits)>NormalizeDouble(OrderOpenPrice()+TrailingStop*pt,Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-TrailingStop*pt,Digits))||(OrderStopLoss()==0))
{
bool mm=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*pt,Digits),OrderTakeProfit(),0,Blue);
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+TrailingStep*pt,Digits)<NormalizeDouble(OrderOpenPrice()-TrailingStop*pt,Digits))
{
if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+TrailingStop*pt,Digits)))||(OrderStopLoss()==0))
{
bool mnm=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*pt,Digits),OrderTakeProfit(),0,Red);
}
}
}
}
}
}
//---------------------------------
void MoveBreakEven()
{
int cnt,total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
if(BreakEven>0)
{
if(NormalizeDouble((Bid-OrderOpenPrice()),Digits)>BreakEven*pt)
{
if(NormalizeDouble((OrderStopLoss()-OrderOpenPrice()),Digits)<0||OrderStopLoss()==0)
{
bool mm=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+movestopto*pt,Digits),OrderTakeProfit(),0,Blue);
}
}
}
}
else
{
if(BreakEven>0)
{
if(NormalizeDouble((OrderOpenPrice()-Ask),Digits)>BreakEven*pt)
{
if(NormalizeDouble((OrderOpenPrice()-OrderStopLoss()),Digits)<0||OrderStopLoss()==0)
{
bool nn=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-movestopto*pt,Digits),OrderTakeProfit(),0,Red);
}
}
}
}
}
}
}
- 15-02-2016, 06:55 PM #12
- 20-02-2016, 09:07 PM #13
- 20-02-2016, 09:10 PM #14
- 20-02-2016, 10:37 PM #15
الشكر والتقدير على المساعده
تحياتى لك