مشاهدة النسخة كاملة : الموضوع المخصص للأسئلة البرمجية mql4
الصفحات :
1
2
3
4
5
6
7
8
[
9]
10
11
12
13
14
15
kira-h
01-03-2019, 06:18 PM
شكرا ع التعديل
بعد عمل الباكتيست تبين الاتي
1- فتح صفقات كثيرة وهذا مخالف لشروطي لذلك انا اشترطت عدم وجود صفقات في شرط الدخول الاول كي يحد من فتح صفقات كثيرة.
2- دالة مساواة العقود ما زالت لا تعمل.
3- كذلك دالة الربح في الايكويتي لا تعمل.
1- طيب، كيف تريد ان يفتح صفقة عكسية وتشترط فتح صفقة وحيدة ؟ راجع الشروط أكثر
2- الدالة والشروط سليمة
3- الشروط سليمة
kira-h
01-03-2019, 06:38 PM
السلام عليكم اخي حسن لدي اكسبيرت ولكني اريد اضافة دالة لفتح صفقة معاكسة للصفقة الخاسرة بمعني عمل هيدج فاذا كانت الصفقة المفتوحة لزوج اليورو دولار بيع وانعكس السعر ٢٠ نقطة يدخل شراء ولا يغلق الصفقة المفتوحة
وعليكم السلام
تم الرد بموضوعك
sabil
02-03-2019, 05:20 AM
1- طيب، كيف تريد ان يفتح صفقة عكسية وتشترط فتح صفقة وحيدة ؟ راجع الشروط أكثر
2- الدالة والشروط سليمة
3- الشروط سليمة
انا كنت قايل له ف الشرط الاول لو مش عندنا صفقات خالص ع الربع ساعة يفتح شراء او بيع طبقاً للشروط
الشرط التاني هيفتح ع الخمس دقائق شراء مثلا بس بشرط تكون اخر صفقة اتفتحت بيع
ويفتح بيع بشرط اخر صفقة اتفتحت تكون شراء
ليه بقى؟
لان الشروط متكررة في كل شمعة
وبعدين اصلا الشروط كانت مظبوطة وبيفتح صح في الباكتيست
انا مشكلتي مع الدوال الاخرى
دالة مساواة العقود والربح في الايكويتي والاتنين ما زال لا يعملان
silver
11-03-2019, 08:29 AM
السلام عليكم
مشرفنا القدير حسن
ما هو الكود الصحيح لدالة التريلينج ستوب والتريلينج ستيب بحيث يكونوا مخفين عن البروكر
بحثت في الإنترنت ولكن بصراحة لم أفهمها بشكل جيد وكامل
تحياتي وتقديري لك
kira-h
11-03-2019, 08:10 PM
السلام عليكم
مشرفنا القدير حسن
ما هو الكود الصحيح لدالة التريلينج ستوب والتريلينج ستيب بحيث يكونوا مخفين عن البروكر
بحثت في الإنترنت ولكن بصراحة لم أفهمها بشكل جيد وكامل
تحياتي وتقديري لك
وعليكم السلام
ستستخدم دوال الجلوبال لحفظ القيم ثم استدعائها...
الطريقة كالتالي "
input double HidenTrailingStop=0,
HidenTrailingStep=0;
void OnTick()
{
if(HidenTrailingStop>0){HidenMoveTrailingStop();CloseHidenTrailingStop( );}
}
void HidenMoveTrailingStop()
{
bool s;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double op=OrderOpenPrice(),
sl=OrderStopLoss(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNo&&ot<=OP_SELL)
{
if(ot==OP_BUY)
{
if(NormalizeDouble(Ask-(HidenTrailingStep*point),Digits)>NormalizeDouble((op+(HidenTrailingStop*point)),Dig its))
{
if((NormalizeDouble(sl,Digits)<NormalizeDouble(Bid-(HidenTrailingStop*point),Digits))||(sl==0))
{
GlobalVariableSet("TS"+OrderTicket(),Bid-HidenTrailingStop*point);
}
}
}
else
{
if(NormalizeDouble(Bid+(HidenTrailingStep*point),D igits)<NormalizeDouble((op-(HidenTrailingStop*point)),Digits))
{
if((NormalizeDouble(sl,Digits)>(NormalizeDouble(Ask+(HidenTrailingStop*point),Dig its)))||(sl==0))
{
GlobalVariableSet("TS"+OrderTicket(),Ask+HidenTrailingStop*point);
}
}
}
}
}
}
void CloseHidenTrailingStop()
{
bool close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
if(OrderType()==OP_BUY&&GlobalVariableGet("TS"+OrderTicket())!=0)
{
if(Bid<=GlobalVariableGet("TS"+OrderTicket()))
{
close=OrderClose(OrderTicket(),OrderLots(),Bid,5);
GlobalVariableDel("TS"+OrderTicket());
}
}
if(OrderType()==OP_SELL&&GlobalVariableGet("TS"+OrderTicket())!=0)
{
if(Ask>=GlobalVariableGet("TS"+OrderTicket()))
{
close=OrderClose(OrderTicket(),OrderLots(),Ask,5);
GlobalVariableDel("TS"+OrderTicket());
}
}
}
}
}
silver
12-03-2019, 04:31 AM
وعليكم السلام
ستستخدم دوال الجلوبال لحفظ القيم ثم استدعائها...
الطريقة كالتالي "
input double HidenTrailingStop=0,
HidenTrailingStep=0;
void OnTick()
{
if(HidenTrailingStop>0){HidenMoveTrailingStop();CloseHidenTrailingStop( );}
}
void HidenMoveTrailingStop()
{
bool s;
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
s=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double op=OrderOpenPrice(),
sl=OrderStopLoss(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNo&&ot<=OP_SELL)
{
if(ot==OP_BUY)
{
if(NormalizeDouble(Ask-(HidenTrailingStep*point),Digits)>NormalizeDouble((op+(HidenTrailingStop*point)),Dig its))
{
if((NormalizeDouble(sl,Digits)<NormalizeDouble(Bid-(HidenTrailingStop*point),Digits))||(sl==0))
{
GlobalVariableSet("TS"+OrderTicket(),Bid-HidenTrailingStop*point);
}
}
}
else
{
if(NormalizeDouble(Bid+(HidenTrailingStep*point),D igits)<NormalizeDouble((op-(HidenTrailingStop*point)),Digits))
{
if((NormalizeDouble(sl,Digits)>(NormalizeDouble(Ask+(HidenTrailingStop*point),Dig its)))||(sl==0))
{
GlobalVariableSet("TS"+OrderTicket(),Ask+HidenTrailingStop*point);
}
}
}
}
}
}
void CloseHidenTrailingStop()
{
bool close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo)
{
if(OrderType()==OP_BUY&&GlobalVariableGet("TS"+OrderTicket())!=0)
{
if(Bid<=GlobalVariableGet("TS"+OrderTicket()))
{
close=OrderClose(OrderTicket(),OrderLots(),Bid,5);
GlobalVariableDel("TS"+OrderTicket());
}
}
if(OrderType()==OP_SELL&&GlobalVariableGet("TS"+OrderTicket())!=0)
{
if(Ask>=GlobalVariableGet("TS"+OrderTicket()))
{
close=OrderClose(OrderTicket(),OrderLots(),Ask,5);
GlobalVariableDel("TS"+OrderTicket());
}
}
}
}
}
شكرا لك مشرفنا
دمجت الكود مع الإكسبيرت واشتغل ولكن ماعندي خلفية كاملة عن دوال الجلوبال وآلية عملها
إن شاء الله راح أقرأ أكثر عن دوال الجلوبال وأحاول فهمها
خالص شكري وامتناني لك
kira-h
12-03-2019, 04:04 PM
شكرا لك مشرفنا
دمجت الكود مع الإكسبيرت واشتغل ولكن ماعندي خلفية كاملة عن دوال الجلوبال وآلية عملها
إن شاء الله راح أقرأ أكثر عن دوال الجلوبال وأحاول فهمها
خالص شكري وامتناني لك
راجع المشاركة التالية: https://www.fxprg.com/vb/showthread.php?t=31457&page=9&p=846193&viewfull=1#post846193
بالتوفيق إن شاء الله
silver
12-03-2019, 11:12 PM
راجع المشاركة التالية: https://www.fxprg.com/vb/showthread.php?t=31457&page=9&p=846193&viewfull=1#post846193
بالتوفيق إن شاء الله
بالتأكيد أخي حسن
ما شاء الله تبارك الله عليك
الله يكثر من أمثالك ويخليك لنا يا رب
bassem2025
13-03-2019, 12:34 AM
السلام عليكم اخي حسن
لو عاوز اضيف علي الاكسبيرت انه يظهر بيانات العملة والساعة والمكسب علي الشارت واقدر اتحكم في حجم الخط اللي بيظهر ولون الكتابة
ايه هي الدالة اللي اقدر ادمجها مع الاكسبيرت وتقوم بالمهمة دي ؟
benaissa
13-03-2019, 11:55 AM
السلام عليكم الأخ العزيز حسن.
من فضلك , اطلب منك أن تشرح لي هذا الكود :
if(ClosedTime(OP_SELL)>CurrentTime()){CloseOrders(OP_SELL);CloseOrders(OP _SELLLIMIT);}
لك مني كل الاحترام و التقدير.
kira-h
13-03-2019, 04:28 PM
بالتأكيد أخي حسن
ما شاء الله تبارك الله عليك
الله يكثر من أمثالك ويخليك لنا يا رب
وإياك اخي الكريم
بالتوفيق إن شاء الله
kira-h
13-03-2019, 04:35 PM
السلام عليكم اخي حسن لو عاوز اضيف علي الاكسبيرت انه يظهر بيانات العملة والساعة والمكسب علي الشارت واقدر اتحكم في حجم الخط اللي بيظهر ولون الكتابة ايه هي الدالة اللي اقدر ادمجها مع الاكسبيرت وتقوم بالمهمة دي ؟
وعليكم السلام ستستخدم الدالة ObjectCreate مع باقي الدوال التابعة لها
دالة كتابة نص على الشارت كالتالي :
void Info(string n,string text,int fontsize,color clor,double c,double X,double Y,string font)//دالة كتابة نص على الشارت
{
ObjectCreate(n, OBJ_LABEL, 0, 0, 0);//دالة كتابة نص
ObjectSetText(n,text,fontsize,font,clor);//دالة خصائص محتوى النص ، الحجم، نوع الكتابة، واللون
ObjectSet(n, OBJPROP_CORNER,1);//موقع النص
ObjectSet(n, OBJPROP_XDISTANCE,X);//موقع النص أفقيا
ObjectSet(n, OBJPROP_YDISTANCE,Y);//موقع النص عموديا
}
مثال لكتابة التوقيت الحالي على الشارت :
void OnTick()
{
Info("Info1","Date",14,DeepSkyBlue,1,195,15,"Times New Roman");
Info("Info2",TimeToString(TimeCurrent(),TIME_DATE),12,Snow,1,2 0,15,"");
}
لمزيد من المعومات راجع المشاركة التالية:
https://www.fxprg.com/vb/showthread.php?t=31456&page=6&p=875644&viewfull=1#post875644
Ahmed Esmail
14-03-2019, 08:07 AM
السلام عليكم يا بشمهندس اريد كود لاغلاق الصفقات عندما تكون خاسرة حوالي ١٥ نقطة وفتح صفقة معاكسة للصفقة المغلقة
وشكرا جزيلا
kira-h
15-03-2019, 09:05 PM
السلام عليكم يا بشمهندس اريد كود لاغلاق الصفقات عندما تكون خاسرة حوالي ١٥ نقطة وفتح صفقة معاكسة للصفقة المغلقة
وشكرا جزيلا
السلام عليكم
يوجد تناقض بطلبك: اغلاق صفقات،،، فتح صفقة معاكسة للصفقة المغلقة !
وضح المطلوب بمثال بالارقام
Ahmed Esmail
16-03-2019, 10:31 AM
وعليكم السلام
نفترض ان الاكسبيرت فتح صفقة شراء لزوح اليورو دولار عند 1.12300 ووصل السعر عند 1.11900 اي خسارة 40 نقطة المطلوب هو عند وصول الصفقة لخسارة حوالي 15 نقطة في هذة الحالة هو اغلاق الصفقة وفتح صفقة بيع والعكس في حالة وجود صفقة بيع وارتد السعر الي اعلي اتمني ان تكون الامور قد اتضحت وشكرا لحضرتك يا باش مهندس
benaissa
16-03-2019, 03:22 PM
السلام عليكم الأخ العزيز حسن.
من فضلك , اطلب منك أن تشرح لي هذا الكود :
if(ClosedTime(OP_SELL)>CurrentTime()){CloseOrders(OP_SELL);CloseOrders(OP _SELLLIMIT);}
لك مني كل الاحترام و التقدير.
على حسب فهمي : اِذا كان توقيت اِغلاق صفقة البيع أكثر من التوقيت الحالي , اغلق كل صفقات البيع و اغلق صفقات البيع المعلقة .
اِذا كان هذا الشرح صحيح , سؤالي : كيف يمكن أن يكون توقيت اِغلاق صفقة أكثر من التوقيت الحالي؟
شكرا أستاذنا القدير.
kira-h
16-03-2019, 03:57 PM
على حسب فهمي : اِذا كان توقيت اِغلاق صفقة البيع أكثر من التوقيت الحالي (بل توقيت الفتح للصفقة المفتوحة) , اغلق كل صفقات البيع و اغلق صفقات البيع المعلقة .
اِذا كان هذا الشرح صحيح , سؤالي : كيف يمكن أن يكون توقيت اِغلاق صفقة أكثر من التوقيت الحالي؟
شكرا أستاذنا القدير.
()CurrentTime دالة خارجية تعود بتوقيت فتح آخر صفقة مفتوحة، فهي ليست الوظيفة ()TimeCurrent التي تعود بالتوقيت الحالي
benaissa
16-03-2019, 05:04 PM
()CurrentTime دالة خارجية تعود بتوقيت فتح آخر صفقة مفتوحة، فهي ليست الوظيفة ()TimeCurrent التي تعود بالتوقيت الحالي
شكرا أُستاذي , الان فهمت , جزاك الله كل خير.
kira-h
17-03-2019, 04:30 AM
شكرا أُستاذي , الان فهمت , جزاك الله كل خير.
العفو وبالتوفيق ان شاء الله
لو سمحت اخى اريد كود مضاعفات ولكن يعمل على معرفة الخساره للصفقات الخاسره
يعني تم فتح عقد 0.01 وخسر
العقد التالي يكون 0.02 واذا اغلق على ربح ولكن لم يسترجع كامل الخساره من العقد 0.01 يفتح العقد الجديد ب 0.02 حتي يرجع كامل الخساره يبداء من جديد او لو 0.02 خسر يفتح عقد 0.03 ونفس الموضوع لازم يرجع كامل الخساره
Ahmed Esmail
17-03-2019, 10:16 AM
وعليكم السلام
نفترض ان الاكسبيرت فتح صفقة شراء لزوح اليورو دولار عند 1.12300 ووصل السعر عند 1.11900 اي خسارة 40 نقطة المطلوب هو عند وصول الصفقة لخسارة حوالي 15 نقطة في هذة الحالة هو اغلاق الصفقة وفتح صفقة بيع والعكس في حالة وجود صفقة بيع وارتد السعر الي اعلي اتمني ان تكون الامور قد اتضحت وشكرا لحضرتك يا باش مهندس
ارجو الرد يا بشمهندس حسن
kira-h
17-03-2019, 02:21 PM
وعليكم السلام
نفترض ان الاكسبيرت فتح صفقة شراء لزوح اليورو دولار عند 1.12300 ووصل السعر عند 1.11900 اي خسارة 40 نقطة المطلوب هو عند وصول الصفقة لخسارة حوالي 15 نقطة في هذة الحالة هو اغلاق الصفقة وفتح صفقة بيع والعكس في حالة وجود صفقة بيع وارتد السعر الي اعلي اتمني ان تكون الامور قد اتضحت وشكرا لحضرتك يا باش مهندس
هذا طلب اكسبيرت وليس سؤال برمجي!
عموما راجع المثال التطبيقي بالمشاركة التالية، وستستطيع بناء شروطك الخاصة
https://www.fxprg.com/vb/showthread.php?t=31456&page=6&p=874924&viewfull=1#post874924
لو سمحت لو كنت تساعدنى
لو سمحت اخى اريد كود مضاعفات ولكن يعمل على معرفة الخساره للصفقات الخاسره
يعني تم فتح عقد 0.01 وخسر
العقد التالي يكون 0.02 واذا اغلق على ربح ولكن لم يسترجع كامل الخساره من العقد 0.01 يفتح العقد الجديد ب 0.02 حتي يرجع كامل الخساره يبداء من جديد او لو 0.02 خسر يفتح عقد 0.03 ونفس الموضوع لازم يرجع كامل الخساره
kira-h
17-03-2019, 11:59 PM
لو سمحت اخى اريد كود مضاعفات ولكن يعمل على معرفة الخساره للصفقات الخاسره
يعني تم فتح عقد 0.01 وخسر
العقد التالي يكون 0.02 واذا اغلق على ربح ولكن لم يسترجع كامل الخساره من العقد 0.01 يفتح العقد الجديد ب 0.02 حتي يرجع كامل الخساره يبداء من جديد او لو 0.02 خسر يفتح عقد 0.03 ونفس الموضوع لازم يرجع كامل الخساره
السلام عليكم
أولا ستحتاج إلى دالة تعود بتوقيت افتتاح أول صفقة ذات حجم العقد الأساسي Lots كالتالي :
datetime FirstClose()
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
datetime om=OrderOpenTime();
if(sy==Symbol()&&mn==MagicNo&&lo==Lots)
{
return(om);
}
}
return(0);
}
ثم دالة تحسب اجمالي الربح لكل الصفقات التي توقيت اغلاقها اكبر من توقيت الدالة السابقة، كالتالي:
double TotalProfit()
{
double pts=0;
for(int i=0;i<OrdersHistoryTotal();i++)
{
bool s=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber();
double pt=OrderProfit(),
sw=OrderSwap(),
cm=OrderCommission();
datetime om=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNo&&om>FirstClose())
{
pts+=pt+sw+cm;
}
}
return(pts);
}
ومنه تضع شروط المضاعفات بحيث إذا كانت الدالة ()TotalProfit اصغر من الـ 0 يستمر في المضاعفات، وإذا العكس يبدأ بالعقد الأساسي
انا عملت كل شيء بس اذا بتقدر تكمل معى ازي اقدر اضع دالة مضاعفات الجمع المناسبه لان حاولت والاكسبيرت بداء يلخبط
السلام عليكم
أولا ستحتاج إلى دالة تعود بتوقيت افتتاح أول صفقة ذات حجم العقد الأساسي Lots كالتالي :
datetime FirstClose()
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
datetime om=OrderOpenTime();
if(sy==Symbol()&&mn==MagicNo&&lo==Lots)
{
return(om);
}
}
return(0);
}
ثم دالة تحسب اجمالي الربح لكل الصفقات التي توقيت اغلاقها اكبر من توقيت الدالة السابقة، كالتالي:
double TotalProfit()
{
double pts=0;
for(int i=0;i<OrdersHistoryTotal();i++)
{
bool s=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber();
double pt=OrderProfit(),
sw=OrderSwap(),
cm=OrderCommission();
datetime om=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNo&&om>FirstClose())
{
pts+=pt+sw+cm;
}
}
return(pts);
}
ومنه تضع شروط المضاعفات بحيث إذا كانت الدالة ()TotalProfit اصغر من الـ 0 يستمر في المضاعفات، وإذا العكس يبدأ بالعقد الأساسي
Ahmed Esmail
18-03-2019, 05:02 PM
السلام عليكم اخي حسن انا محتاج اعرف استخدم ال math min& math max بمعني انا لو عندي ٣ متغيرات الاول هو pivot point والتاني هو support point (s1) والتالت هو resistence point (R1) وفكرة الاكسبيرت هي ان يفتح صفقة بناء علي النقطة الاقرب بمعني ان لو النقطة s1 اقرب نقطة للسعر الحالي يفتح صفقة بيع ولو النقطة R1 اقرب نقطة للسعر يفتح صفقة شراء اتمني تكون الفكرة وصلت وانا عاوز بس كود المقارنة وشكرا لحضرتك جدا
kira-h
18-03-2019, 07:27 PM
انا عملت كل شيء بس اذا بتقدر تكمل معى ازي اقدر اضع دالة مضاعفات الجمع المناسبه لان حاولت والاكسبيرت بداء يلخبط
ارفق الكود المفتوح للمراجعة
أو راجع المشاركة التالية :
https://www.fxprg.com/vb/showthread.php?t=31456&page=2&p=844595&viewfull=1#post844595
kira-h
18-03-2019, 09:19 PM
السلام عليكم اخي حسن انا محتاج اعرف استخدم ال math min& math max بمعني انا لو عندي ٣ متغيرات الاول هو pivot point والتاني هو support point (s1) والتالت هو resistence point (R1) وفكرة الاكسبيرت هي ان يفتح صفقة بناء علي النقطة الاقرب بمعني ان لو النقطة s1 اقرب نقطة للسعر الحالي يفتح صفقة بيع ولو النقطة R1 اقرب نقطة للسعر يفتح صفقة شراء اتمني تكون الفكرة وصلت وانا عاوز بس كود المقارنة وشكرا لحضرتك جدا
وعليكم السلام
مثال عن مقارنات الـ MathMin :
double R1=5,R2=1,R3=10;
double MinValue=MathMin(MathMin(R1,R2),R3);
نفس المبدأ بالـ MathMax
ممكن لو سمحت تتأكد من دالة مضاعفات المصفوفه لان شغاله كويس ولكن بيثبت على اللوت رقم 2 لما يخسر مش بيكمل المضاعفات الاعلي فقط يبقى على المضاعفة رقم 2
ارفق الكود المفتوح للمراجعة
أو راجع المشاركة التالية :
https://www.fxprg.com/vb/showthread.php?t=31456&page=2&p=844595&viewfull=1#post844595
kira-h
19-03-2019, 03:48 PM
ممكن لو سمحت تتأكد من دالة مضاعفات المصفوفه لان شغاله كويس ولكن بيثبت على اللوت رقم 2 لما يخسر مش بيكمل المضاعفات الاعلي فقط يبقى على المضاعفة رقم 2
الشروط سليمة بموضوع التطبيقات
ارفق الكود الذي قمت بعمله للمراجعة والتصحيح
sabil
20-03-2019, 05:39 PM
بالنسبة لمؤشر الماكد
عايز دالة توضح بيانات اخر اكبر خط هيستوجرام كان تحت الصفر وكذالك فوق الصفر
للتوضيح اكتر
بالنسبة للقيعان
خطوط هيستوجرام فوق الصفر ثم تحركت خطوط الهيستوجرام تحت الصفر ثم اصبحت فوق الصفر مرة اخرى
هنا يتم حساب اكبر خط هيستوجرام تحت الصفر
ثم بيانات خط الهيستوجرام للشمعة السابقة
بالنسبة للقمم
خطوط هيستوجرام تحت الصفر ثم تحركت خطوط الهيستوجرام فوق الصفر ثم اصبحت تحت الصفر مرة اخرى
هنا يتم حساب اكبر خط هيستوجرام فوق الصفر
ثم بيانات خط الهيستوجرام للشمعة السابقة
------------------------------------
نفس الشيء مع الشموع
عايز بيانات اعلى اخر قمة شموع فوق الصفر لمؤشر الماكد
وبيانات ادنى اخر قاع شموع تحت الصفر لمؤشر الماكد
kira-h
21-03-2019, 11:50 PM
بالنسبة لمؤشر الماكد
عايز دالة توضح بيانات اخر اكبر خط هيستوجرام كان تحت الصفر وكذالك فوق الصفر
للتوضيح اكتر
بالنسبة للقيعان
خطوط هيستوجرام فوق الصفر ثم تحركت خطوط الهيستوجرام تحت الصفر ثم اصبحت فوق الصفر مرة اخرى
هنا يتم حساب اكبر خط هيستوجرام تحت الصفر
ثم بيانات خط الهيستوجرام للشمعة السابقة
بالنسبة للقمم
خطوط هيستوجرام تحت الصفر ثم تحركت خطوط الهيستوجرام فوق الصفر ثم اصبحت تحت الصفر مرة اخرى
هنا يتم حساب اكبر خط هيستوجرام فوق الصفر
ثم بيانات خط الهيستوجرام للشمعة السابقة
------------------------------------
نفس الشيء مع الشموع
عايز بيانات اعلى اخر قمة شموع فوق الصفر لمؤشر الماكد
وبيانات ادنى اخر قاع شموع تحت الصفر لمؤشر الماكد
مثال لاقل وأكبر قيمة لمؤشر ATR ويمكنك تطبيق نفس الشيء بشروطك الخاصة
double LowestATR()//أقل قيمة للمؤشر في 20 شمعة سابقة
{
double lowest=EMPTY_VALUE;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr<lowest)
{
lowest=atr;
}
}
return(lowest);
}
double HighestATR()//أكبر قيمة للمؤشر في 20 شمعة سابقة
{
double highest=0;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr>highest)
{
highest=atr;
}
}
return(highest);
}
أما سعر أقل أو اكبر قيمة للـ ATR فهو نفس الكود السابق مع بعض التعديلات كالتالي:
double LowATR()
{
double low=0,lowest=EMPTY_VALUE;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr<lowest)
{
lowest=atr;
}
if(atr==lowest)low=Low[i];
}
return(low);
}
double HighATR()
{
double high=0,highest=0;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr>highest)
{
highest=atr;
}
if(atr==highest)high=High[i];
}
return(high);
}
شكراً على المتابعه
انشغلت اليومين اللى راحو
اخى انا اريد الان فقط اضافة فلتر الموفينج يكون 3 موفينج كلهم اعدادات افتراضية
مع تقاطع موفينج 15 للأسفل مع موفينج 95 ويكون التقاطع تحت موفينج 150 اى اشارة بيع تتفعل ولكن الشراء لا تتفعل
مع تقاطع موفينج 15 للأعلى مع موفينج 95 ويكون التقاطع فوق موفينج 150 اى اشارة شراء تتفعل ولكن البيع لا تتفعل
الشروط سليمة بموضوع التطبيقات
ارفق الكود الذي قمت بعمله للمراجعة والتصحيح
kira-h
22-03-2019, 07:03 PM
شكراً على المتابعه
انشغلت اليومين اللى راحو
اخى انا اريد الان فقط اضافة فلتر الموفينج يكون 3 موفينج كلهم اعدادات افتراضية
مع تقاطع موفينج 15 للأسفل مع موفينج 95 ويكون التقاطع تحت موفينج 150 اى اشارة بيع تتفعل ولكن الشراء لا تتفعل
مع تقاطع موفينج 15 للأعلى مع موفينج 95 ويكون التقاطع فوق موفينج 150 اى اشارة شراء تتفعل ولكن البيع لا تتفعل
الشروط برمجيا كالتالي:
double f1=iMA(Symbol(),0,15,0,0,0,1),//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2),//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1),//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2),//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma)//شراء
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma)//بيع
شكراً لك اخى هل ينفع احدد الفريم لشروط الموفينجات دى ؟ احدد ان الشروط دى تكون على فريم الساعه فقط بغض النظر عن الاكسبيرت شغال على اى فريم
الشروط برمجيا كالتالي:
double f1=iMA(Symbol(),0,15,0,0,0,1),//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2),//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1),//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2),//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma)//شراء
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma)//بيع
kira-h
23-03-2019, 04:37 PM
شكراً لك اخى هل ينفع احدد الفريم لشروط الموفينجات دى ؟ احدد ان الشروط دى تكون على فريم الساعه فقط بغض النظر عن الاكسبيرت شغال على اى فريم
نعم،
مثال على فريم الساعة PERIOD_H1
double f1=iMA(Symbol(),PERIOD_H1,15,0,0,0,1),//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),PERIOD_H1,15,0,0,0,2),//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),PERIOD_H1,95,0,0,0,1),//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),PERIOD_H1,95,0,0,0,2),//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),PERIOD_H1,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
مش عارف ايه الخطاء فى الاكسبيرت ده بيفتح اوردرات كتير من غير ما شروط الدخول تتحقق وبعد اضافة المضاعفات مش بيفتح اوردرات خالص ياريت التعديل ولو وقتك يسمح لشرح التعديل وشكراً لك اخى
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades=1;
extern double Lots = 0.01;
extern int StopL = 50;
extern int TakeP = 50;
extern int MagicNumber = 321;
input double LotsMP = 2;
input double MaxLots = 5;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,MacdNow;
double SL,TP,NewLots;
double point;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits==4 || Digits<=2) point=Point;
if(Digits==5 || Digits==3) point=Point*10;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
MacdNow=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN ,1);
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
}
//شراء
void BuyOrder()
{
if(TotalOrders(OP_BUY)<MaxTrades)
if(LotsMP>0)
{
if(LastOrder("Profit")<0)NewLots=MathMin(NormalizeDouble(LastOrder("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(LastOrder("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(NewLots>=MaxLots)NewLots=Lots;
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&MacdNow>0){
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Normali zeDouble(Ask,Digits),3,Ask-StopL*point,Ask+TakeP*point,"",MagicNumber,0,Blue);
}
}
//بيع
void SellOrder()
{
if(LotsMP>0)
{
if(LastOrder("Profit")<0)NewLots=MathMin(NormalizeDouble(LastOrder("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(LastOrder("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(NewLots>=MaxLots)NewLots=Lots;
if(TotalOrders(OP_BUY)<MaxTrades)
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd2<0&&Macd3<0&&Macd4<0&&MacdNow<0){
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Norma lizeDouble(Bid,Digits),3,Bid+StopL*point,Bid-TakeP*point,"",MagicNumber,0,Red);
}
}
//+------------------------------------------------------------------+
int TotalOrders(int type)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1)){
cnt++;
}
}
}
return(cnt);
}
double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime(),
cm=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="CloseTime")return(cm);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}
شكراً لك اخى ارفقت لك كود الاكسبيرت لان بعد اضافة المضاعفات توقف عن العمل ياريت التعديل وشرح اذا وقتك يسمح
نعم،
مثال على فريم الساعة PERIOD_H1
double f1=iMA(Symbol(),PERIOD_H1,15,0,0,0,1),//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),PERIOD_H1,15,0,0,0,2),//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),PERIOD_H1,95,0,0,0,1),//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),PERIOD_H1,95,0,0,0,2),//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),PERIOD_H1,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
sabil
24-03-2019, 01:32 AM
مثال لاقل وأكبر قيمة لمؤشر ATR ويمكنك تطبيق نفس الشيء بشروطك الخاصة
double LowestATR()//أقل قيمة للمؤشر في 20 شمعة سابقة
{
double lowest=EMPTY_VALUE;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr<lowest)
{
lowest=atr;
}
}
return(lowest);
}
double HighestATR()//أكبر قيمة للمؤشر في 20 شمعة سابقة
{
double highest=0;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr>highest)
{
highest=atr;
}
}
return(highest);
}
أما سعر أقل أو اكبر قيمة للـ ATR فهو نفس الكود السابق مع بعض التعديلات كالتالي:
double LowATR()
{
double low=0,lowest=EMPTY_VALUE;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr<lowest)
{
lowest=atr;
}
if(atr==lowest)low=Low[i];
}
return(low);
}
double HighATR()
{
double high=0,highest=0;
for(int i=1;i<=20;i++)
{
double atr=iATR(Symbol(),0,14,i);
if(atr>highest)
{
highest=atr;
}
if(atr==highest)high=High[i];
}
return(high);
}
شكرا اخي حسن
للاسف مش ظابطة معي وكمان الدالة غير دقيقة لشروطي الخاصة
لذلك قمت بانشاء موضوع في قسم الطلبات على الرابط التالي :
https://www.fxprg.com/vb/showthread.php?t=34508&p=895471#post895471
ارجو عمل المطلوب
kira-h
24-03-2019, 11:33 PM
شكرا اخي حسن
للاسف مش ظابطة معي وكمان الدالة غير دقيقة لشروطي الخاصة
لذلك قمت بانشاء موضوع في قسم الطلبات على الرابط التالي :
https://www.fxprg.com/vb/showthread.php?t=34508&p=895471#post895471
ارجو عمل المطلوب
طيب راجع الكود اسفله
datetime MACD(string info)//توقيت بداية ونهاية العمود بآخر إشارة
{
for(int i=1;i<=Bars;i++)
{
double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i),
m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i+1),
md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
if(md<0)
{
if(info=="Time1"&&m1>0&&m2<=0)return(Time[i]);
if(info=="Time2"&&m1<=0&&m2>0)return(Time[i+1]);
}
if(md>0)
{
if(info=="Time1"&&m1<0&&m2>=0)return(Time[i]);
if(info=="Time2"&&m1>=0&&m2<0)return(Time[i+1]);
}
}
return(0);
}
double MACDIndex()//أقل أو أعلى قيمة للماكد لاخر اشارة
{
double high=0,highest=0,low=0,lowest=EMPTY_VALUE;
for(int i=1;i<=Bars;i++)
{
double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i);
double m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i);
double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
if(m1<lowest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md>0){lowest=m1;}
if(m1==lowest)low=m1;
if(m2>highest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md<0){highest=m2;}
if(m2==highest)high=m2;
}
if(md<0)return(high);
if(md>0)return(low);
else return(0);
}
double MACDPrice()//أقل أو أعلى سعر بآخر اشارة للماكد
{
double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
int b1=iBarShift(Symbol(),0,MACD("Time1"),true),
b2=iBarShift(Symbol(),0,MACD("Time2"),true);
if(md>0)return(Low[iLowest(Symbol(),0,MODE_LOW,b1,b2)]);
if(md<0)return(High[iHighest(Symbol(),0,MODE_HIGH,b1,b2)]);
else return(0);
}
بذكرك فقط لان بعتقد انك مخدتش بالك من الرد
مش عارف ايه الخطاء فى الاكسبيرت ده بيفتح اوردرات كتير من غير ما شروط الدخول تتحقق وبعد اضافة المضاعفات مش بيفتح اوردرات خالص ياريت التعديل ولو وقتك يسمح لشرح التعديل وشكراً لك اخى
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades=1;
extern double Lots = 0.01;
extern int StopL = 50;
extern int TakeP = 50;
extern int MagicNumber = 321;
input double LotsMP = 2;
input double MaxLots = 5;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,MacdNow;
double SL,TP,NewLots;
double point;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits==4 || Digits<=2) point=Point;
if(Digits==5 || Digits==3) point=Point*10;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
MacdNow=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN ,1);
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
}
//شراء
void BuyOrder()
{
if(TotalOrders(OP_BUY)<MaxTrades)
if(LotsMP>0)
{
if(LastOrder("Profit")<0)NewLots=MathMin(NormalizeDouble(LastOrder("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(LastOrder("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(NewLots>=MaxLots)NewLots=Lots;
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&MacdNow>0){
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Normali zeDouble(Ask,Digits),3,Ask-StopL*point,Ask+TakeP*point,"",MagicNumber,0,Blue);
}
}
//بيع
void SellOrder()
{
if(LotsMP>0)
{
if(LastOrder("Profit")<0)NewLots=MathMin(NormalizeDouble(LastOrder("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(LastOrder("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(NewLots>=MaxLots)NewLots=Lots;
if(TotalOrders(OP_BUY)<MaxTrades)
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd2<0&&Macd3<0&&Macd4<0&&MacdNow<0){
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Norma lizeDouble(Bid,Digits),3,Bid+StopL*point,Bid-TakeP*point,"",MagicNumber,0,Red);
}
}
//+------------------------------------------------------------------+
int TotalOrders(int type)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1)){
cnt++;
}
}
}
return(cnt);
}
double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime(),
cm=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="CloseTime")return(cm);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}
kira-h
25-03-2019, 05:57 PM
بذكرك فقط لان بعتقد انك مخدتش بالك من الرد
لم تستدعي دالتي البيع والشراء بالدالة الرئيسية OnTick لهذا لم يتم التنفيذ
اما كثرة الصفقات سببها انك لم تضع شرط توقيت الشمعة بحيث لا يتجاوز صفقة واحدة بالشمعة المحققة الشروط time (راجعها بالكود اسفله)
كذلك المؤشرات معرفة بالدالة الرئيسية بينما بدالتي البيع والشراء لن يستطيع معرفتها
لهذا الافضل استخدام كل المعرفات والشروط بداخل الدالة الرئيسية
مثال :
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double LotsMP = 2;
input double MaxLots = 5;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4)point=0.01;else point=0.0001;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
if(LotsMP>0)
{
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
}
}
}
return(0);
}
sabil
26-03-2019, 12:10 AM
طيب راجع الكود اسفله
datetime MACD(string info)//توقيت بداية ونهاية العمود بآخر إشارة
{
for(int i=1;i<=Bars;i++)
{
double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i),
m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i+1),
md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
if(md<0)
{
if(info=="Time1"&&m1>0&&m2<=0)return(Time[i]);
if(info=="Time2"&&m1<=0&&m2>0)return(Time[i+1]);
}
if(md>0)
{
if(info=="Time1"&&m1<0&&m2>=0)return(Time[i]);
if(info=="Time2"&&m1>=0&&m2<0)return(Time[i+1]);
}
}
return(0);
}
double MACDIndex()//أقل أو أعلى قيمة للماكد لاخر اشارة
{
double high=0,highest=0,low=0,lowest=EMPTY_VALUE;
for(int i=1;i<=Bars;i++)
{
double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i);
double m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i);
double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
if(m1<lowest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md>0){lowest=m1;}
if(m1==lowest)low=m1;
if(m2>highest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md<0){highest=m2;}
if(m2==highest)high=m2;
}
if(md<0)return(high);
if(md>0)return(low);
else return(0);
}
double MACDPrice()//أقل أو أعلى سعر بآخر اشارة للماكد
{
double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
int b1=iBarShift(Symbol(),0,MACD("Time1"),true),
b2=iBarShift(Symbol(),0,MACD("Time2"),true);
if(md>0)return(Low[iLowest(Symbol(),0,MODE_LOW,b1,b2)]);
if(md<0)return(High[iHighest(Symbol(),0,MODE_HIGH,b1,b2)]);
else return(0);
}
رائع اخي حسن
شكرا جزيلا
لكن
حاولت افصل القيم اعلى واسفل خط الصفر للماكد لم استطيع
للتوضيح اكثر
دالوقتي انا عايز اقارن السعر الحالي من حيث (قيمة الشموع ، قيمة الماكد) كالتالي :
1- لو السعر الحالي فوق خط الصفر اذن هقارنه فقط باخر قمة للماكد والشموع حصلت فوق خط الصفر.
2- لو السعر الحالي تحت خط الصفر اذن هقارنه فقط باخر قاع للماكد والشموع حصلت تحت خط الصفر.
اذن هعمل الاتي
اولا هعمل متغيرين للماكد الحالي كالتالي :
double current_macd_high=iMACD(Symbol(),0,12,26,9,0,MODE_ MAIN,1);
double current_macd_low=iMACD(Symbol(),0,12,26,9,0,MODE_M AIN,1);
وبعدين ابدأ المقارنة في شروط الدخول كالتالي :
1- في حالة الشراء
if((current_macd_low<MACDIndex()&&Low[1]>MACDPrice()) || (current_macd_low>MACDIndex()&&Low[1]<MACDPrice()))
2- في حالة البيع
if((current_macd_high<MACDIndex()&&High[1]>MACDPrice()) || (current_macd_high>MACDIndex()&&High[1]<MACDPrice()))
زي ما حضرتك شايف الدالتين :
MACDIndex()
MACDPrice()
عامتين وغير خاصة بالقمة لوحدها والقاع لوحده
احتاج سعر وقيمة الماكد فوق الصفر لوحده وتحت الصفر لوحده حتى يمكنني المقارنة بشكل ادق
sabil
26-03-2019, 12:33 AM
رائع اخي حسن
شكرا جزيلا
لكن
حاولت افصل القيم اعلى واسفل خط الصفر للماكد لم استطيع
للتوضيح اكثر
دالوقتي انا عايز اقارن السعر الحالي من حيث (قيمة الشموع ، قيمة الماكد) كالتالي :
1- لو السعر الحالي فوق خط الصفر اذن هقارنه فقط باخر قمة للماكد والشموع حصلت فوق خط الصفر.
2- لو السعر الحالي تحت خط الصفر اذن هقارنه فقط باخر قاع للماكد والشموع حصلت تحت خط الصفر.
اذن هعمل الاتي
اولا هعمل متغيرين للماكد الحالي كالتالي :
double current_macd_high=iMACD(Symbol(),0,12,26,9,0,MODE_ MAIN,1);
double current_macd_low=iMACD(Symbol(),0,12,26,9,0,MODE_M AIN,1);
وبعدين ابدأ المقارنة في شروط الدخول كالتالي :
1- في حالة الشراء
if((current_macd_low<MACDIndex()&&Low[1]>MACDPrice()) || (current_macd_low>MACDIndex()&&Low[1]<MACDPrice()))
2- في حالة البيع
if((current_macd_high<MACDIndex()&&High[1]>MACDPrice()) || (current_macd_high>MACDIndex()&&High[1]<MACDPrice()))
زي ما حضرتك شايف الدالتين :
MACDIndex()
MACDPrice()
عامتين وغير خاصة بالقمة لوحدها والقاع لوحده
احتاج سعر وقيمة الماكد فوق الصفر لوحده وتحت الصفر لوحده حتى يمكنني المقارنة بشكل ادق
راجعت الكود مرة اخرى وقمت بعمل تعديلات كالتالي :
1- تحديد اخر قمة للماكد فوق الصفر
double MACDIndex_High()//أقل أو أعلى قيمة للماكد لاخر اشارة{ double high=0,highest=0; for(int i=1;i<=Bars;i++) { double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
if(m2>highest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md<0){highest=m2;} if(m2==highest)high=m2; } if(md<0)return(high); else return(0);}
2- تحديد اخر قمة للسعر فوق الصفر
double MACDPrice_High()//أقل أو أعلى سعر بآخر اشارة للماكد{ double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1); int b1=iBarShift(Symbol(),0,MACD("Time1"),true), b2=iBarShift(Symbol(),0,MACD("Time2"),true); if(md<0)return(High[iHighest(Symbol(),0,MODE_HIGH,b1,b2)]); else return(0);}
3- تحديد اخر قاع للماكد تحت الصفر
double MACDIndex_Low()//أقل أو أعلى قيمة للماكد لاخر اشارة{ double low=0,lowest=EMPTY_VALUE; for(int i=1;i<=Bars;i++) { double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1); if(m1<lowest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md>0){lowest=m1;} if(m1==lowest)low=m1;
} if(md>0)return(low); else return(0);}
4- تحديد اخر قاع للسعر تحت الصفر
double MACDPrice_Low()//أقل أو أعلى سعر بآخر اشارة للماكد{ double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1); int b1=iBarShift(Symbol(),0,MACD("Time1"),true), b2=iBarShift(Symbol(),0,MACD("Time2"),true); if(md>0)return(Low[iLowest(Symbol(),0,MODE_LOW,b1,b2)]); else return(0);}
وشروط الدخول شراء
if((current_macd_low<MACDIndex_Low()&&Low[1]>MACDPrice_Low()) || (current_macd_low>MACDIndex_Low()&&Low[1]<MACDPrice_Low()))
شروط دخول البيع
if((current_macd_high<MACDIndex_High()&&High[1]>MACDPrice_High()) || (current_macd_high>MACDIndex_High()&&High[1]<MACDPrice_High()))
ارجو تصحيح الاخطاء ان وجد
شكراً لك اخى على المساعده
لم تستدعي دالتي البيع والشراء بالدالة الرئيسية OnTick لهذا لم يتم التنفيذ
اما كثرة الصفقات سببها انك لم تضع شرط توقيت الشمعة بحيث لا يتجاوز صفقة واحدة بالشمعة المحققة الشروط time (راجعها بالكود اسفله)
كذلك المؤشرات معرفة بالدالة الرئيسية بينما بدالتي البيع والشراء لن يستطيع معرفتها
لهذا الافضل استخدام كل المعرفات والشروط بداخل الدالة الرئيسية
مثال :
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double LotsMP = 2;
input double MaxLots = 5;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4)point=0.01;else point=0.0001;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
if(LotsMP>0)
{
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
}
}
}
return(0);
}
بعد اذنك ازى الاكسبيرت يشتغل مضاعفات بس كل نوع اوردر لوحده
اوردر شراء خسر 0.01 اوردر الشراء اللى بعده يكون 0.02 لا دخل لأوردرات البيع بالمضاعفات لوت البيع مستمر 0.01 وقت ان البيع بداء يخسر يبداء فى المضاعفات
مضاعفات لنوع الاوردر الخاسر بس اذا الشراء خسر يعمل مضاعفات على الشراء بس واذا البيع خسر يعمل على البيع مضاعفات بس
لم تستدعي دالتي البيع والشراء بالدالة الرئيسية OnTick لهذا لم يتم التنفيذ
اما كثرة الصفقات سببها انك لم تضع شرط توقيت الشمعة بحيث لا يتجاوز صفقة واحدة بالشمعة المحققة الشروط time (راجعها بالكود اسفله)
كذلك المؤشرات معرفة بالدالة الرئيسية بينما بدالتي البيع والشراء لن يستطيع معرفتها
لهذا الافضل استخدام كل المعرفات والشروط بداخل الدالة الرئيسية
مثال :
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double LotsMP = 2;
input double MaxLots = 5;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4)point=0.01;else point=0.0001;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
if(LotsMP>0)
{
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
}
}
}
return(0);
}
kira-h
26-03-2019, 10:50 PM
بعد اذنك ازى الاكسبيرت يشتغل مضاعفات بس كل نوع اوردر لوحده
اوردر شراء خسر 0.01 اوردر الشراء اللى بعده يكون 0.02 لا دخل لأوردرات البيع بالمضاعفات لوت البيع مستمر 0.01 وقت ان البيع بداء يخسر يبداء فى المضاعفات
مضاعفات لنوع الاوردر الخاسر بس اذا الشراء خسر يعمل مضاعفات على الشراء بس واذا البيع خسر يعمل على البيع مضاعفات بس
كالتالي :
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
if(LotsMP>0)
{
if(Closed("Profit",OP_BUY)<0)NewLots=MathMin(NormalizeDouble(Closed("Lots",OP_BUY)*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT ));
if(Closed("Profit",OP_BUY)>=0)NewLots=Lots;
}
if(LotsMP<=0||(MaxLots>0&&NewLots>=MaxLots))NewLots=Lots;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
if(LotsMP>0)
{
if(Closed("Profit",OP_SELL)<0)NewLots=MathMin(NormalizeDouble(Closed("Lots",OP_SELL)*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLO T));
if(Closed("Profit",OP_SELL)>=0)NewLots=Lots;
}
if(LotsMP<=0||(MaxLots>0&&NewLots>=MaxLots))NewLots=Lots;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
kira-h
26-03-2019, 10:56 PM
راجعت الكود مرة اخرى وقمت بعمل تعديلات كالتالي :
1- تحديد اخر قمة للماكد فوق الصفر
double MACDIndex_High()//أقل أو أعلى قيمة للماكد لاخر اشارة{ double high=0,highest=0; for(int i=1;i<=Bars;i++) { double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1);
if(m2>highest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md<0){highest=m2;} if(m2==highest)high=m2; } if(md<0)return(high); else return(0);}
2- تحديد اخر قمة للسعر فوق الصفر
double MACDPrice_High()//أقل أو أعلى سعر بآخر اشارة للماكد{ double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1); int b1=iBarShift(Symbol(),0,MACD("Time1"),true), b2=iBarShift(Symbol(),0,MACD("Time2"),true); if(md<0)return(High[iHighest(Symbol(),0,MODE_HIGH,b1,b2)]); else return(0);}
3- تحديد اخر قاع للماكد تحت الصفر
double MACDIndex_Low()//أقل أو أعلى قيمة للماكد لاخر اشارة{ double low=0,lowest=EMPTY_VALUE; for(int i=1;i<=Bars;i++) { double m1=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double m2=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,i); double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1); if(m1<lowest&&Time[i]>=MACD("Time1")&&Time[i]<=MACD("Time2")&&md>0){lowest=m1;} if(m1==lowest)low=m1;
} if(md>0)return(low); else return(0);}
4- تحديد اخر قاع للسعر تحت الصفر
double MACDPrice_Low()//أقل أو أعلى سعر بآخر اشارة للماكد{ double md=iMACD(Symbol(),0,12,26,9,0,MODE_MAIN,1); int b1=iBarShift(Symbol(),0,MACD("Time1"),true), b2=iBarShift(Symbol(),0,MACD("Time2"),true); if(md>0)return(Low[iLowest(Symbol(),0,MODE_LOW,b1,b2)]); else return(0);}
وشروط الدخول شراء
if((current_macd_low<MACDIndex_Low()&&Low[1]>MACDPrice_Low()) || (current_macd_low>MACDIndex_Low()&&Low[1]<MACDPrice_Low()))
شروط دخول البيع
if((current_macd_high<MACDIndex_High()&&High[1]>MACDPrice_High()) || (current_macd_high>MACDIndex_High()&&High[1]<MACDPrice_High()))
ارجو تصحيح الاخطاء ان وجد
نعم يمكن فصل الشروط ولكنها غير صالحة للمقارنة فيما بينها لأن الدالة لا تستخرج إلا نتيجة آخر ترند، يعني قيم آخر صعود أو هبوط مكتمل،
ولو تريد مقارنة قيم الترند الاخير مع قيم الترند السابق فالامر معقد بحيث يجب عمل الكثير من التعديلات ودوال جديدة لحصر الترند السابق
sabil
26-03-2019, 11:21 PM
نعم يمكن فصل الشروط ولكنها غير صالحة للمقارنة فيما بينها لأن الدالة لا تستخرج إلا نتيجة آخر ترند، يعني قيم آخر صعود أو هبوط مكتمل،
ولو تريد مقارنة قيم الترند الاخير مع قيم الترند السابق فالامر معقد بحيث يجب عمل الكثير من التعديلات ودوال جديدة لحصر الترند السابق
ما انا عشان كده طلبت مؤشر والدخول بناءاً ع اشارات الاسهم ولا متنفعش؟
kira-h
27-03-2019, 01:52 AM
ما انا عشان كده طلبت مؤشر والدخول بناءاً ع اشارات الاسهم ولا متنفعش؟
لا يوجد فرق
sabil
27-03-2019, 03:30 AM
لا يوجد فرق
طيب ياريت تعملها اذا وقت حضرتك يسمح
يعني مش لازما تعمل المؤشر مرة واحدة
ممكن كل ما يبقى عندك وقت اكتب شوي ولو اخد منك فترة مش مشكلة
https://www.fxprg.com/vb/showthread.php?t=34508
Tarek987
27-03-2019, 12:54 PM
السلام عليكم
انا عندي اكسبيرت يفتح صفقات متعددة و لكل صفقة لها اسم محدد (comment) و لها شرط محدد للاغلاق لا يتعلق بالصفقات المفتوحة الاخرى.
الرجاء اريد دالة او طريقة تغلق صفقة واحدة فقط بحيث هذه الدلة تنظر الى الكومنت للصفقات و كل صفقة تحققت شروط اغلاقها على حدى يغلق هذه الصفقة فقط لوحدها.
و بالنهاية شكرا اخي حسن و الله ينور عليك و على والديك و يرزقك من حيث لا تحتسب.
شكراً لك اعذرنى على اسألتى ولكن عايز اعرف ازى بيختلف كتابة كل كود للمضاعفات
انا عايز اعمل ان اذا كان فى اوردر شراء شغال 0.01 وتحقق شروط اوردر بيع يكون المضاعفه للبيع 0.02 بغض النظر عن الشراء فى ربح او خسارة يعنى اذا الاوردر التالى عكس الاوردر اللى شغال اخر حاجه يشتغل على المضاعفات ولو تحقق ربح من اخر اوردر يبداء من 0.01
ويكون فى الشروط اذا عملت كود اغلاق الاوردرات المعاكسه اللى هو CloseAtNext بس فى اوردر شراء وتم اغلاق اوردر الشراء بواسطه CloseAtNext ولم يتم تفعيل اوردر معاكس اللى هيكون بيع لسبب ان لم يكتمل شروط الدخول وبداء يتحقق شروط دخول شراء تانى يكون المضاعفه شراء 0.02
يعنى كدا هيكون فى الشروط للمضاعفات نقطتين
المضاعفات تبداء اذا كان فى اوردر معاكس لأخر اوردر
و مضاعفات اذا اخر اوردر اغلق على خساره والاوردر التالي كان من نفس نوعه
كالتالي :
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
if(LotsMP>0)
{
if(Closed("Profit",OP_BUY)<0)NewLots=MathMin(NormalizeDouble(Closed("Lots",OP_BUY)*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT ));
if(Closed("Profit",OP_BUY)>=0)NewLots=Lots;
}
if(LotsMP<=0||(MaxLots>0&&NewLots>=MaxLots))NewLots=Lots;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
if(LotsMP>0)
{
if(Closed("Profit",OP_SELL)<0)NewLots=MathMin(NormalizeDouble(Closed("Lots",OP_SELL)*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLO T));
if(Closed("Profit",OP_SELL)>=0)NewLots=Lots;
}
if(LotsMP<=0||(MaxLots>0&&NewLots>=MaxLots))NewLots=Lots;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
نسيت اوضح حاجه فى المشاركه السابقه فى اى حالة من حالات اغلاق الاوردرات عن طريق CloseAtNext ربح او خساره يكمل فى المضاعفات حتى يكون الربح عن طريق ضرب الهدف
شكراً لك اعذرنى على اسألتى ولكن عايز اعرف ازى بيختلف كتابة كل كود للمضاعفات
انا عايز اعمل ان اذا كان فى اوردر شراء شغال 0.01 وتحقق شروط اوردر بيع يكون المضاعفه للبيع 0.02 بغض النظر عن الشراء فى ربح او خسارة يعنى اذا الاوردر التالى عكس الاوردر اللى شغال اخر حاجه يشتغل على المضاعفات ولو تحقق ربح من اخر اوردر يبداء من 0.01
ويكون فى الشروط اذا عملت كود اغلاق الاوردرات المعاكسه اللى هو CloseAtNext بس فى اوردر شراء وتم اغلاق اوردر الشراء بواسطه CloseAtNext ولم يتم تفعيل اوردر معاكس اللى هيكون بيع لسبب ان لم يكتمل شروط الدخول وبداء يتحقق شروط دخول شراء تانى يكون المضاعفه شراء 0.02
يعنى كدا هيكون فى الشروط للمضاعفات نقطتين
المضاعفات تبداء اذا كان فى اوردر معاكس لأخر اوردر
و مضاعفات اذا اخر اوردر اغلق على خساره والاوردر التالي كان من نفس نوعه
kira-h
28-03-2019, 09:00 PM
السلام عليكم ورحمه الله وبركاته
اخونا الأستاذ حسن احتاج الي كود معين وهو كالتالي
نفترض انني وضعت علي الشارت عدد معين من خطوط الدعم
مثلا 50 وعدد معين من خطوط المقاومه مثلا 50
خطوط الدعم تم تسميتها Up 1 و Up2 وUp3 هكذا الي ما لانهايه
وخطوط المقاومه تم تمسيتها Down 1 و Down2 وDown3 وهكذا الي ما لإنهايه
اريد لوب يتم تخزين فيها قيمه الخطوط
اريد كلما وصل السعر الي اَي خط بغض النظر عن اسمه او كونه دعم او مقاومه يقوم الاكسبيرت بفتح صفقه
اذا اتي السعر من الأسفل وارتفع ولمس الخط دخول بيع بمجرد اللمس
اذا اتي السعر من الاعلي وهبط ولمس الخط شراء بمجرد اللمس
اعرف انني ممكن اسمي كل الخطوط باسم واحد up او down
ولكنني احتاج الكود في حال اشتغلت علي مؤشر
يرسم الخطوط جاهزه ولكن قد تكون اسماء الخطوط بداخله مختلفه
برجاء إرفاق الكود مع شرح مبسط له لكي افهمه اخي وشكرا
وعليكم السلام
كالتالي:
for(int i=1;i<=50;i++)
{
double up=ObjectGet("Up"+i,OBJPROP_PRICE1),
dn=ObjectGet("Down"+i,OBJPROP_PRICE1);
if((Close[1]>up&&Close[0]<=up)||(Close[1]>dn&&Close[0]<=dn))
{
//Buy
}
if((Close[1]<up&&Close[0]>=up)||(Close[1]<dn&&Close[0]>=dn))
{
//Sell
}
}
elhelaly
28-03-2019, 09:13 PM
وعليكم السلام
كالتالي:
for(int i=1;i<=50;i++)
{
double up=ObjectGet("Up"+i,OBJPROP_PRICE1),
dn=ObjectGet("Down"+i,OBJPROP_PRICE1);
if((Close[1]>up&&Close[0]<=up)||(Close[1]>dn&&Close[0]<=dn))
{
//Buy
}
if((Close[1]<up&&Close[0]>=up)||(Close[1]<dn&&Close[0]>=dn))
{
//Sell
}
}
الف شكر يا استاذنا
kira-h
28-03-2019, 10:11 PM
نسيت اوضح حاجه فى المشاركه السابقه فى اى حالة من حالات اغلاق الاوردرات عن طريق CloseAtNext ربح او خساره يكمل فى المضاعفات حتى يكون الربح عن طريق ضرب الهدف
اخي الكريم هذا الموضوع مخصص فقط للأسئلة البرمجية وليس الطلبات!
يعني ضع محاولاتك البرمجية للمراجعة أو التصحيح
kira-h
28-03-2019, 10:17 PM
السلام عليكم
انا عندي اكسبيرت يفتح صفقات متعددة و لكل صفقة لها اسم محدد (comment) و لها شرط محدد للاغلاق لا يتعلق بالصفقات المفتوحة الاخرى.
الرجاء اريد دالة او طريقة تغلق صفقة واحدة فقط بحيث هذه الدلة تنظر الى الكومنت للصفقات و كل صفقة تحققت شروط اغلاقها على حدى يغلق هذه الصفقة فقط لوحدها.
و بالنهاية شكرا اخي حسن و الله ينور عليك و على والديك و يرزقك من حيث لا تحتسب.
وعليكم السلام
هذا على حسب الطريقة البرمجية المستخدمة بالاكسبيرت، منها المصفوفات أو دوال بدلالة الكومنت وغيرها...
عموما دالة الاغلاق بدلالة الكومنت كالتالي:
void CloseOrders(string comment,int type=-1)
{
bool select,close,del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
cm==OrderComment();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo&&cm==comment)
{
if(ot==type||type==-1)
{
if(ot==OP_BUY){close=OrderClose(tk,lo,NormalizeDou ble(Bid,Digits),5*Q);}
if(ot==OP_SELL){close=OrderClose(tk,lo,NormalizeDo uble(Ask,Digits),5*Q);}
if(ot>OP_SELL){del=OrderDelete(tk);}
}
}
}
}
مثلا لو تريد اغلاق صفقة باسم Order1 سيكون كالتالي:
CloseOrders("Order1");
Tarek987
29-03-2019, 12:06 PM
وعليكم السلام
هذا على حسب الطريقة البرمجية المستخدمة بالاكسبيرت، منها المصفوفات أو دوال بدلالة الكومنت وغيرها...
عموما دالة الاغلاق بدلالة الكومنت كالتالي:
void CloseOrders(string comment,int type=-1)
{
bool select,close,del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
cm==OrderComment();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo&&cm==comment)
{
if(ot==type||type==-1)
{
if(ot==OP_BUY){close=OrderClose(tk,lo,NormalizeDou ble(Bid,Digits),5*Q);}
if(ot==OP_SELL){close=OrderClose(tk,lo,NormalizeDo uble(Ask,Digits),5*Q);}
if(ot>OP_SELL){del=OrderDelete(tk);}
}
}
}
}
مثلا لو تريد اغلاق صفقة باسم Order1 سيكون كالتالي:
CloseOrders("Order1");
شكرا كثيرا حسن و ربي يرزقك على مجهودك و صبرك،
حسن عندي طلب تاني لو سمحت،
اريد طريقة او دالة تنظر و تبحث ب الكومنت للاوامر المفتوحة
بحيث هذه الدالة ترجع لي اذا كانت الصفقة على ربح بعد حساب ثلاث اشياء الكومشن و السواب و طبعا البروفيت هل هم اكبر من الصفر (يعني اي ربح حتى لو بسيط لانه لا يوجد تيك بروفيت بهذا الاكسبيرت)،
كما ذكرت لك حسن ان الاكسبيرت يفتح صفقات متعددة و كل صفقة لها اسم محدد يتعلق بالتايم فريم المخصص لها،
مثال :
لو كان عندنا صفقات مفتوحة كثيرة و من بينهم صفقة بيع مفتوحة مخصصة للخمس دقائق تايم فريم و لها كومنت
"Sell 5 min"
الان و بعد مرور بعض الوقت تحققت شروط الشراء على الخمس دقائق تايم فريم، انا اريد من الدالة ان تنظر لي على الكومنت
"Sell 5 min"
و ترجع لي هل هذه الصفقة على ربح حتى لو بسيط بعد حساب الكومشن و السواب و بالتالي الصفقة تغلق
( انت علمتني كيف اغلقها يعطيك العافية حسن )
و بالنهاية كالعادة حسن اشكرك جدا و الله يوفقك و ينور عليك انت و والديك.
هنا حاولت فى كتابة الكود ان يكمل فى المضاعفات اذا اغلق اوردر على خساره او اخر اوردر اغلق على ربح وليس Take Profit
ولكن يبداء من البدايه اذا اخر اوردر ضرب الهدف
المشكله فى دالة LastOrder او انا كاتب الشروط بشكل غير صحيح ؟
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double LotsMP = 2;
input double MaxLots = 5;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4)point=0.01;else point=0.0001;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
if(LotsMP>0)
{
if(Closed("Profit")<0&&LastOrder("Profit")>0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(LastOrder("TP")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(CloseAtNext)CloseDeleteOrders(OP_SELL);
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(CloseAtNext)CloseDeleteOrders(OP_BUY);
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime(),
cm=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="CloseTime")return(cm);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}
kira-h
29-03-2019, 08:41 PM
شكرا كثيرا حسن و ربي يرزقك على مجهودك و صبرك،
حسن عندي طلب تاني لو سمحت،
اريد طريقة او دالة تنظر و تبحث ب الكومنت للاوامر المفتوحة
بحيث هذه الدالة ترجع لي اذا كانت الصفقة على ربح بعد حساب ثلاث اشياء الكومشن و السواب و طبعا البروفيت هل هم اكبر من الصفر (يعني اي ربح حتى لو بسيط لانه لا يوجد تيك بروفيت بهذا الاكسبيرت)،
كما ذكرت لك حسن ان الاكسبيرت يفتح صفقات متعددة و كل صفقة لها اسم محدد يتعلق بالتايم فريم المخصص لها،
مثال :
لو كان عندنا صفقات مفتوحة كثيرة و من بينهم صفقة بيع مفتوحة مخصصة للخمس دقائق تايم فريم و لها كومنت
"Sell 5 min"
الان و بعد مرور بعض الوقت تحققت شروط الشراء على الخمس دقائق تايم فريم، انا اريد من الدالة ان تنظر لي على الكومنت
"Sell 5 min"
و ترجع لي هل هذه الصفقة على ربح حتى لو بسيط بعد حساب الكومشن و السواب و بالتالي الصفقة تغلق
( انت علمتني كيف اغلقها يعطيك العافية حسن )
و بالنهاية كالعادة حسن اشكرك جدا و الله يوفقك و ينور عليك انت و والديك.
دالة الربح بدلالة الكومنت كالتالي:
double Profit(string comment,int type=-1)
{
double ptt=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
cm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
sw=OrderSwap(),
mm=OrderCommission();
if(sy==Symbol()&&mn==MagicNo&&cm==comment&&(ty==type||type==-1))
{
ptt=pt+sw+mm;
return(ptt);
}
}
return(0);
}
kira-h
29-03-2019, 09:24 PM
هنا حاولت فى كتابة الكود ان يكمل فى المضاعفات اذا اغلق اوردر على خساره او اخر اوردر اغلق على ربح وليس Take Profit
ولكن يبداء من البدايه اذا اخر اوردر ضرب الهدف
المشكله فى دالة LastOrder او انا كاتب الشروط بشكل غير صحيح ؟
...
الاغلاق العكسي خاطئ فلم تضع شروطه الخاصة!
عموما جرب الكود التالي بحيث LotsMP1 مضاعفات الصفقة المغلقة ، و LotsMP2 مضاعفات الصفقة المفتوحة
وسيضل يضاعف إذا لم تحقق الصفقة الهدف
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double LotsMP1 = 2;
input double LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(TotalOrders()==0)
{
if(LotsMP1>0)
{
if(Closed("Profit")<0||(Closed("Profit")>=0&&NormalizeDouble(Closed("ClosePrice"),digits)!=NormalizeDouble(Closed("TP"),digits)))NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(NormalizeDouble(Closed("ClosePrice"),digits)==NormalizeDouble(Closed("TP"),digits))NewLots=Lots;
}
else NewLots=Lots;
}
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
Tarek987
29-03-2019, 09:45 PM
دالة الربح بدلالة الكومنت كالتالي:
double Profit(string comment,int type=-1)
{
double ptt=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
cm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
sw=OrderSwap(),
mm=OrderCommission();
if(sy==Symbol()&&mn==MagicNo&&cm==comment&&(ty==type||type==-1))
{
ptt=pt+sw+mm;
return(ptt);
}
}
return(0);
}
بارك الله بك يا حسن، ربي يوفقك و يرزقك .
LotsMP1 مش شغال بيفتح الاوردرات بنفس اللوت الاول اذا كان خساره او ربح
LotsMP2 شغال مضاعفات للأوردرات التاليه ولكن عند ضرب الهدف يستمر فى المضاعفات ايضاً وعند تحقيق خسائر يبداء من اول لوت
الاغلاق العكسي خاطئ فلم تضع شروطه الخاصة!
عموما جرب الكود التالي بحيث LotsMP1 مضاعفات الصفقة المغلقة ، و LotsMP2 مضاعفات الصفقة المفتوحة
وسيضل يضاعف إذا لم تحقق الصفقة الهدف
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double LotsMP1 = 2;
input double LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(TotalOrders()==0)
{
if(LotsMP1>0)
{
if(Closed("Profit")<0||(Closed("Profit")>=0&&NormalizeDouble(Closed("ClosePrice"),digits)!=NormalizeDouble(Closed("TP"),digits)))NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(NormalizeDouble(Closed("ClosePrice"),digits)==NormalizeDouble(Closed("TP"),digits))NewLots=Lots;
}
else NewLots=Lots;
}
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
kira-h
30-03-2019, 05:14 PM
بارك الله بك يا حسن، ربي يوفقك و يرزقك .
وإياك أخي الكريم
kira-h
30-03-2019, 05:26 PM
LotsMP1 مش شغال بيفتح الاوردرات بنفس اللوت الاول اذا كان خساره او ربح
LotsMP2 شغال مضاعفات للأوردرات التاليه ولكن عند ضرب الهدف يستمر فى المضاعفات ايضاً وعند تحقيق خسائر يبداء من اول لوت
الشروط سليمة برمجيا ومنطقيا ولكن لن تتحقق بالسوق الحقيقي لانه صعب ان يكون الربح على الهدف يساوي فعليا الهدف بالاعدادات! بسبب اعادة تسعير وقفزات سعرية وتغير السبريد... لن يتحقق شرط التساوي بين الربح والهدف
لهذا الافضل اعتماد الربح فقط بالشروط كالتالي :
if(LotsMP1>0)
{
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
kira-h
30-03-2019, 06:11 PM
static bool alert=true;
datetime time;
{
if(StrToDouble(Trend_UP) >= 90 && alert == TRUE && time!=Time[0] && alert)
{
SendMail(" Trend_UP ( bUY) ",Symbol()+" "+Period()+" --"" "" "+StrToDouble(Trend_UP)+"% ""-- "" "" "" "+DoubleToStr(Ask,Digits) +"--" " " + TimeToStr(TimeLocal(),TIME_SECONDS));
time=Time[0]
; alert=false;return(0);
}
}
{
if(StrToDouble(Trend_DOWN) >= 90 && alert == TRUE && time!=Time[0] && alert)
{
SendMail(" Trend_DOWN ( SELL) ",Symbol()+" "+Period()+" --"" "" "+StrToDouble(Trend_DOWN)+"% ""-- "" "" "" "+DoubleToStr(Ask,Digits) +"--" " " + TimeToStr(TimeLocal(),TIME_SECONDS));
time=Time[0]
; alert=false;return(0);
}
}
هدذا الكود يحتاج اضافة كود لاعادة ارسال الايميل عند بداية شمعة جديدةظ لانه بيعث الايميل مره واحدة عند اكنمال الشروط ولا يكرر الارسال .
احتاج مساعدة تعديل الكود
وشكرا
السلام عليكم
كالتالي:
static bool up=false,dn=false;
datetime time;
int start()
{
if((StrToDouble(Trend_UP) >= 90 || up==true) && time!=Time[0])
{
SendMail(" Trend_UP ( bUY) ",Symbol()+" "+Period()+" --"" "" "+StrToDouble(Trend_UP)+"% ""-- "" "" "" "+DoubleToStr(Ask,Digits) +"--" " " + TimeToStr(TimeLocal(),TIME_SECONDS));
time=Time[0];
if(up==false)up=true;
else up=false;
return(0);
}
if((StrToDouble(Trend_DOWN) >= 90 || dn==true) && time!=Time[0])
{
SendMail(" Trend_DOWN ( SELL) ",Symbol()+" "+Period()+" --"" "" "+StrToDouble(Trend_DOWN)+"% ""-- "" "" "" "+DoubleToStr(Ask,Digits) +"--" " " + TimeToStr(TimeLocal(),TIME_SECONDS));
time=Time[0];
if(dn==false)dn=true;
else dn=false;
return(0);
}
return(0);
}
الشروط سليمة برمجيا ومنطقيا ولكن لن تتحقق بالسوق الحقيقي لانه صعب ان يكون الربح على الهدف يساوي فعليا الهدف بالاعدادات! بسبب اعادة تسعير وقفزات سعرية وتغير السبريد... لن يتحقق شرط التساوي بين الربح والهدف
لهذا الافضل اعتماد الربح فقط بالشروط كالتالي :
if(LotsMP1>0)
{
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0)NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
12989
الصوره بتوضح المضاعفات فى حالة الربح ايضا احتاج تعديل الكود انه يستمر فى المضاعفات كما هو يعمل الان ولكن لا يبداء من اول لوت الا في حالة اخر اوردر T/P هنا يبداء من جديد
اما S/L او Close يكمل فى المضاعفات حتى اذا كان فى اوردر close على ربح يستمر ايضا لا يبداء من جديد الا ما اوردر يضرب الهدف
sabil
31-03-2019, 05:22 AM
طيب لو حبيت ارسم الخطوط يدوي زي الصورة المرفقة
ايه الدوال الل اقدر اشتغل بيها ع الخطوط الاربعة؟ من حيث اختراقها اعلى واسفل كخطوط الدعم وهكذا
kira-h
31-03-2019, 04:50 PM
12989
الصوره بتوضح المضاعفات فى حالة الربح ايضا احتاج تعديل الكود انه يستمر فى المضاعفات كما هو يعمل الان ولكن لا يبداء من اول لوت الا في حالة اخر اوردر T/P هنا يبداء من جديد
اما S/L او Close يكمل فى المضاعفات حتى اذا كان فى اوردر close على ربح يستمر ايضا لا يبداء من جديد الا ما اوردر يضرب الهدف
لا يمكن التمييز بين الصفقة المغلقة تلقائيا وبين الصفقة المغلقة على الهدف، إلا بمقارنة سعر الاغلاق مع سعر الهدف بشرط التساوي، ولكن هذا الشرط لن يتحقق على ارض الواقع بسبب تغيرات السوق من سبريد وقفزات سعرية وغيرها...
عموما مرفق الكود
if(LotsMP1>0)
{
if(Closed("Profit")<0||NormalizeDouble(Closed("TP"),digits)!=NormalizeDouble(Closed("ClosePrice"),digits))NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&NormalizeDouble(Closed("TP"),digits)==NormalizeDouble(Closed("ClosePrice"),digits))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
مبدع فوركس
31-03-2019, 05:06 PM
السلام عليكم اخى الكريم لدي مشكله بسيطه وارجو منك الرد
لقد قمت باستدعاء مؤشر خارجى عن طريق دالة icustom ولاكن عند وضعها تحت الاختبار عن طريق print يعطى القيمه صفر
الاوامر المستخدمه لاستدعاء المؤشر هى
int start() { double buy1=iCustom(NULL,0,"morning",1,0); double buy2=iCustom(NULL,0,"morning",2,0); double sell1=iCustom(NULL,0,"morning",0,0); double sell2=iCustom(NULL,0,"morning",3,0);
المؤشر نفسه مرفق
Tarek987
31-03-2019, 08:09 PM
السلام عليكم حسن و الجميع.
حسن ممكن تعلمني طريقة كتابة دالة وظيفتها كالتالي:
انا عم احاول اكتب اكسبيرت يفتح صفقات كثيرة و يقوم بوضع كومنت محدد لكل صفقة،
المطلوب دالة ترجعلي هل هناك صفقة مفتوحة بدلالة كومنت محدد او لا.
مثال:
بعد تحقق شروط البيع على الخمس دقائق تايم فريم التي بالعادة لها كومنت
"Sell 5 min"
و بعد مرور بعض من الوقت تحققت شروط البيع مرة ثانية على فريم الخمس دقائق و لكن انا لا اريد من الاكسبيرت بفتح صفقة بيع اخرى لهذا التايم فريم لانه بالاصل هنالك صفقة مفتوحة،
لذلك اريدك ان تعلمني كتابة دالة تقوم باخبار الاكسبيرت ان هنالك صفقة مفتوحة بهذا الاسم مسبقا
"Sell 5 min"
شكرا حسن و ادعو لك الله ان ييسر لك امورك.
kira-h
31-03-2019, 08:20 PM
السلام عليكم اخى الكريم لدي مشكله بسيطه وارجو منك الرد
لقد قمت باستدعاء مؤشر خارجى عن طريق دالة icustom ولاكن عند وضعها تحت الاختبار عن طريق print يعطى القيمه صفر
الاوامر المستخدمه لاستدعاء المؤشر هى
int start() { double buy1=iCustom(NULL,0,"morning",1,0); double buy2=iCustom(NULL,0,"morning",2,0); double sell1=iCustom(NULL,0,"morning",0,0); double sell2=iCustom(NULL,0,"morning",3,0);
المؤشر نفسه مرفق
وعليكم السلام
دوال الاستدعاء سليمة، والقيمة 0 هي القيمة الافتراضية عند عدم وجود الاشارة بالشمعة 0
kira-h
31-03-2019, 08:26 PM
السلام عليكم حسن و الجميع.
حسن ممكن تعلمني طريقة كتابة دالة وظيفتها كالتالي:
انا عم احاول اكتب اكسبيرت يفتح صفقات كثيرة و يقوم بوضع كومنت محدد لكل صفقة،
المطلوب دالة ترجعلي هل هناك صفقة مفتوحة بدلالة كومنت محدد او لا.
مثال:
بعد تحقق شروط البيع على الخمس دقائق تايم فريم التي بالعادة لها كومنت
"Sell 5 min"
و بعد مرور بعض من الوقت تحققت شروط البيع مرة ثانية على فريم الخمس دقائق و لكن انا لا اريد من الاكسبيرت بفتح صفقة بيع اخرى لهذا التايم فريم لانه بالاصل هنالك صفقة مفتوحة،
لذلك اريدك ان تعلمني كتابة دالة تقوم باخبار الاكسبيرت ان هنالك صفقة مفتوحة بهذا الاسم مسبقا
"Sell 5 min"
شكرا حسن و ادعو لك الله ان ييسر لك امورك.
وعليكم السلام
دالة عدد الصفقات المفتوحة بدلالة الكومنت كالتالي:
int Orderscnt(string comment,int type=-1)
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderComment()==comment)
{
if(OrderType()==type||type==-1)cnt++;
}
}
}
return(cnt);
}
Tarek987
01-04-2019, 01:15 AM
وعليكم السلام
دالة عدد الصفقات المفتوحة بدلالة الكومنت كالتالي:
int Orderscnt(string comment,int type=-1)
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderComment()==comment)
{
if(OrderType()==type||type==-1)cnt++;
}
}
}
return(cnt);
}
حسن ربي يعطيك الف عافية و يرزقك
يا شباب بس حسن يساعدنا و جب ان ندعي له بالخير و على الاقل نضغط على الاعلانات بالموقع ك شكر بسيط لحسن
طيب ينفع نكتب نص يكون ان اذا تحقق ربح ولكن اكبر من عدد نقاط 100 نقطه ابداء من اول لوت ؟
لا يمكن التمييز بين الصفقة المغلقة تلقائيا وبين الصفقة المغلقة على الهدف، إلا بمقارنة سعر الاغلاق مع سعر الهدف بشرط التساوي، ولكن هذا الشرط لن يتحقق على ارض الواقع بسبب تغيرات السوق من سبريد وقفزات سعرية وغيرها...
عموما مرفق الكود
if(LotsMP1>0)
{
if(Closed("Profit")<0||NormalizeDouble(Closed("TP"),digits)!=NormalizeDouble(Closed("ClosePrice"),digits))NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&NormalizeDouble(Closed("TP"),digits)==NormalizeDouble(Closed("ClosePrice"),digits))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
kira-h
01-04-2019, 04:14 AM
طيب ينفع نكتب نص يكون ان اذا تحقق ربح ولكن اكبر من عدد نقاط 100 نقطه ابداء من اول لوت ؟
نعم ينفع ولكن يجب ان تضع قيمة أقل من قيمة الهدف مراعاة لفارق السبريد وإعادة التسعير...
وبالتالي سيصبح الكود :
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double Gap = 5;
input double LotsMP1 = 2;
input double LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0||(Closed("Profit")>=0&&profit<(TakeP-Gap)*point))NewLots=MathMin(NormalizeDouble(Closed ("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit>=(TakeP-Gap)*point)NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
kira-h
01-04-2019, 04:15 AM
حسن ربي يعطيك الف عافية و يرزقك
يا شباب بس حسن يساعدنا و جب ان ندعي له بالخير و على الاقل نضغط على الاعلانات بالموقع ك شكر بسيط لحسن
بارك الله فيك
وإياك أخي الكريم
kira-h
01-04-2019, 04:19 AM
طيب لو حبيت ارسم الخطوط يدوي زي الصورة المرفقة
ايه الدوال الل اقدر اشتغل بيها ع الخطوط الاربعة؟ من حيث اختراقها اعلى واسفل كخطوط الدعم وهكذا
السلام عليكم
ستستخدم الوظيفة ObjectCreate
راجع المشاركة التالية : دوال رسم خط عمودي، أفقي، مائل، الفيبوناتشي والكومنت على الشارت (https://www.fxprg.com/vb/showthread.php?t=31456&page=2&p=875644&viewfull=1#post875644)
مثال لدالة رسم خط افقي :
void Draw_Line(string name,double price,color Color)
{
if(ObjectFind(name)!=0)
{
ObjectCreate(name,OBJ_HLINE,0,0,price);
ObjectSet(name,OBJPROP_COLOR,Color);
}
else
{
if(ObjectGet(name,OBJPROP_PRICE1)!=price)
{
ObjectDelete(name);
Draw_Line(name,price,Color);
}
}
}
sabil
01-04-2019, 05:15 AM
السلام عليكم
ستستخدم الوظيفة ObjectCreate
راجع المشاركة التالية : دوال رسم خط عمودي، أفقي، مائل، الفيبوناتشي والكومنت على الشارت (https://www.fxprg.com/vb/showthread.php?t=31456&page=2&p=875644&viewfull=1#post875644)
مثال لدالة رسم خط افقي :
void Draw_Line(string name,double price,color Color)
{
if(ObjectFind(name)!=0)
{
ObjectCreate(name,OBJ_HLINE,0,0,price);
ObjectSet(name,OBJPROP_COLOR,Color);
}
else
{
if(ObjectGet(name,OBJPROP_PRICE1)!=price)
{
ObjectDelete(name);
Draw_Line(name,price,Color);
}
}
}
اظن لم تفهم سؤالي اخي حسن
لم اسأل عن كيفية رسم الخطوط
انا سارسمها يدوياً ولكن كيف استدعي تلك الخطوط المرسومة فعليا داخل الاكسبرت
مثلا شراء وبيع عند اختراقها
مبدع فوركس
01-04-2019, 12:25 PM
وعليكم السلام
دوال الاستدعاء سليمة، والقيمة 0 هي القيمة الافتراضية عند عدم وجود الاشارة بالشمعة 0
اولا شكرا لردك
ثانيا هى على طول تعطى القيمه صفر فكيف اجعلها تعطى القيمه الحاليه للمؤشر
مرفق صوره للمؤشر
kira-h
01-04-2019, 01:19 PM
اولا شكرا لردك
ثانيا هى على طول تعطى القيمه صفر فكيف اجعلها تعطى القيمه الحاليه للمؤشر
مرفق صوره للمؤشر
لا ليس دائما ستتغير القيمة 0 الى سعر الخط عند وجوده بالشمعة 0
يمكنك اعتماد الشمعة 1 يعني مراجعة اشارات المؤشر باخر شمعة مغلقة
مبيفتحش اوردرات وبيطلع خطأ 4051 فى جرنال
نعم ينفع ولكن يجب ان تضع قيمة أقل من قيمة الهدف مراعاة لفارق السبريد وإعادة التسعير...
وبالتالي سيصبح الكود :
//+------------------------------------------------------------------+
//| NewEA.mq4 |
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double Gap = 5;
input double LotsMP1 = 2;
input double LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0||(Closed("Profit")>=0&&profit<(TakeP-Gap)*point))NewLots=MathMin(NormalizeDouble(Closed ("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit>=(TakeP-Gap)*point)NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
kira-h
01-04-2019, 06:15 PM
مبيفتحش اوردرات وبيطلع خطأ 4051 فى جرنال
هذا لأن عند بداية عمل الاكسبيرت لا يستطيع حساب معادلة نقاط الهدف بالمضاعفات فلا يجد صفقة مغلقة بالهيستوري، لهذا يجب اضافة شرط عدد الصفقات المغلقة بحيث إذا لا توجد اي صفقة مغلقة يفتح بأول عقد مباشرة
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double Gap = 5;
input double LotsMP1 = 2;
input double LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0||(Closed("Profit")>=0&&profit<(TakeP-Gap)*point))NewLots=MathMin(NormalizeDouble(Closed ("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
شكراً على التوضيح ياخى
لكن الوقتى بداء يفتح اوردرات ولكن المضاعفات مستمره بدون توقف وتم تحديد قيمة gap اقل من الهدف بفرق 15 نقطه كما قلت وضرب الهدف 100 نقطه وانا حدت gap 85 نقطة ولكن استمر فى المضاعفات ايضاً
و LotsMP2 يبداء من اول لوت وقت ضرب اوردر هدف بنفس شروط gap ل LotsMP1 بشرط ان يكون الاوردر اللى ضرب الهدف هو اخر اوردر تفعل
هذا لأن عند بداية عمل الاكسبيرت لا يستطيع حساب معادلة نقاط الهدف بالمضاعفات فلا يجد صفقة مغلقة بالهيستوري، لهذا يجب اضافة شرط عدد الصفقات المغلقة بحيث إذا لا توجد اي صفقة مغلقة يفتح بأول عقد مباشرة
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input double StopL = 50;
input double TakeP = 50;
input double Gap = 5;
input double LotsMP1 = 2;
input double LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0||(Closed("Profit")>=0&&profit<(TakeP-Gap)*point))NewLots=MathMin(NormalizeDouble(Closed ("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
Ghassebd
01-04-2019, 10:04 PM
13019
السلام عليكم
كالتالي:
static bool up=false,dn=false;
datetime time;
int start()
{
if((StrToDouble(Trend_UP) >= 90 || up==true) && time!=Time[0])
{
SendMail(" Trend_UP ( bUY) ",Symbol()+" "+Period()+" --"" "" "+StrToDouble(Trend_UP)+"% ""-- "" "" "" "+DoubleToStr(Ask,Digits) +"--" " " + TimeToStr(TimeLocal(),TIME_SECONDS));
time=Time[0];
if(up==false)up=true;
else up=false;
return(0);
}
if((StrToDouble(Trend_DOWN) >= 90 || dn==true) && time!=Time[0])
{
SendMail(" Trend_DOWN ( SELL) ",Symbol()+" "+Period()+" --"" "" "+StrToDouble(Trend_DOWN)+"% ""-- "" "" "" "+DoubleToStr(Ask,Digits) +"--" " " + TimeToStr(TimeLocal(),TIME_SECONDS));
time=Time[0];
if(dn==false)dn=true;
else dn=false;
return(0);
}
return(0);
}
kira-h
02-04-2019, 01:18 AM
شكراً على التوضيح ياخى
لكن الوقتى بداء يفتح اوردرات ولكن المضاعفات مستمره بدون توقف وتم تحديد قيمة gap اقل من الهدف بفرق 15 نقطه كما قلت وضرب الهدف 100 نقطه وانا حدت gap 85 نقطة ولكن استمر فى المضاعفات ايضاً
و LotsMP2 يبداء من اول لوت وقت ضرب اوردر هدف بنفس شروط gap ل LotsMP1 بشرط ان يكون الاوردر اللى ضرب الهدف هو اخر اوردر تفعل
أخي الكريم المفروض بعد كل تلك التعديلات تستطيع حل اي مشكلة بعدها! فقط فكر بالمنطق وكيف الاكسبيرت يقرأ الشروط بالترتيب من أعلى الى اسفل
عموما الـ gap يجب أن تكون قيمته أقل من قيمة الهدف لكي تكون نتيجة المعادلة موجبة كهدف أخير
بالنسبة للتعديل التاني لم افهم شرحك، وضح أكثر بأمثلة بالارقام أو بصورة تخطيطية
kira-h
02-04-2019, 01:24 AM
13019
الخطأ ليس من الكود، بل من اعدادات التنبيه بالمنصة
يمكنك مراجعة الطريقة على اليوتيوب :
إرسال بريد الكتروني عبر ميتا تريدر (https://www.youtube.com/watch?v=VS8t4G78xvc)
إرسال تنبيه من المتاتريدر 4 إلى الموبايل (https://www.youtube.com/watch?v=Oi8d1gKA-jY)
kira-h
02-04-2019, 01:29 AM
اظن لم تفهم سؤالي اخي حسن
لم اسأل عن كيفية رسم الخطوط
انا سارسمها يدوياً ولكن كيف استدعي تلك الخطوط المرسومة فعليا داخل الاكسبرت
مثلا شراء وبيع عند اختراقها
ستستخدم دالة الاستدعاء لخط من نوع اوبجكت ObjectGet
مثال :
دالة استدعاء سعر خط افقي باسم Line كالتالي:
double price=ObjectGet("Line",OBJPROP_PRICE1);
شرط الاختراق من اسفل الى اعلى كالتالي :
if(Close[1]<price&&Close[0]>=price)//...
LotsMP2 مضاعفات للاوردرات المفتوحه يعنى الاوردر التالي بيكون بالمضاعفات الشرط اللى عايز اكتبه انه يبداء من اول لوت 0.01 لما اوردر يضرب الهدف t/p ويكون الاوردر اللى ضرب الهدف هو اخر اوردر كان مفتوح على المنصه والاوردر اللى قبله كان من نفس نوعه
يعنى اذا فى اوردر بيع اتفتح 0.01 وبعده اتفتح اوردر شراء 0.02 والبيع ضرب الهدف هيكمل مضاعفات عادى لان البيع مش اخر اوردر اتفتح على المنصه
اما اذا كان فى اوردر بيع اتفتح 0.01 وبعده اتفتح اوردر شراء 0.02 وبعده اتفتح اوردر شراء 0.03 والاوردر ال 0.03 ضرب الهدف يبداء من جديد 0.01 لان الاوردر 0.03 يعتبر كان اخر اوردر اتفتح على المنصه والاوردر اللى قبله كان من نفس نوعه
الكود يكون اذا كان الاوردر الى قبل الاخير من نفس نوع اخر اوردر مفتوح و الاوردر الاخير ضرب هدف وكان الهدف اكبر من gap يبداء من جديد 0.01
أخي الكريم المفروض بعد كل تلك التعديلات تستطيع حل اي مشكلة بعدها! فقط فكر بالمنطق وكيف الاكسبيرت يقرأ الشروط بالترتيب من أعلى الى اسفل
عموما الـ gap يجب أن تكون قيمته أقل من قيمة الهدف لكي تكون نتيجة المعادلة موجبة كهدف أخير
بالنسبة للتعديل التاني لم افهم شرحك، وضح أكثر بأمثلة بالارقام أو بصورة تخطيطية
kira-h
02-04-2019, 05:13 PM
LotsMP2 مضاعفات للاوردرات المفتوحه يعنى الاوردر التالي بيكون بالمضاعفات الشرط اللى عايز اكتبه انه يبداء من اول لوت 0.01 لما اوردر يضرب الهدف t/p ويكون الاوردر اللى ضرب الهدف هو اخر اوردر كان مفتوح على المنصه والاوردر اللى قبله كان من نفس نوعه
يعنى اذا فى اوردر بيع اتفتح 0.01 وبعده اتفتح اوردر شراء 0.02 والبيع ضرب الهدف هيكمل مضاعفات عادى لان البيع مش اخر اوردر اتفتح على المنصه
اما اذا كان فى اوردر بيع اتفتح 0.01 وبعده اتفتح اوردر شراء 0.02 وبعده اتفتح اوردر شراء 0.03 والاوردر ال 0.03 ضرب الهدف يبداء من جديد 0.01 لان الاوردر 0.03 يعتبر كان اخر اوردر اتفتح على المنصه والاوردر اللى قبله كان من نفس نوعه
الكود يكون اذا كان الاوردر الى قبل الاخير من نفس نوع اخر اوردر مفتوح و الاوردر الاخير ضرب هدف وكان الهدف اكبر من gap يبداء من جديد 0.01
الصفقة بمجرد إغلاقها تأخد ترتيب جديد وبالتالي الشروط غير ممكنة ولا ارى حل مناسب لما تريد
مفيش مشكله اخى انت تعبت معايا فى الكود ده ربنا يوفقك ويجزيك كل خير على اللى بتعمله
اخر شيء احتاجه للكود ده
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0||(Closed("Profit")>=0&&profit<(TakeP-Gap)*point))NewLots=MathMin(NormalizeDouble(Closed ("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
هذا التعديل سوف يقلل من المضاعفات قليلاً
اوردر فتح 0.01 ضرب وقف الخسائر هيكمل مضاعفات
هيفتح اوردر 0.02 لو اغلق close على ربح وليس T/P
يفتح اوردر بنفس اللوت 0.02 تانى ولو ضرب وقف الخساره هيكمل مضاعفات
هيفتح اوردر 0.04 لو اغلق colse على خساره هيكمل مضاعفات
يعنى تكرار اللوت السابق فى حالة اغلاق الاوردر close على ربح وليس T/P
والمضاعفات هتبقا فى حالة اذا كان الاوردر close على خساره او S/L
واسف على التعديلات الكثيره ودا اخر تعديل فى الكود ده وشكراً لحضرتك وتعبتك معايا وربنا يجزيك كل خير
الصفقة بمجرد إغلاقها تأخد ترتيب جديد وبالتالي الشروط غير ممكنة ولا ارى حل مناسب لما تريد
Ghassebd
02-04-2019, 10:33 PM
السلام عليكم
ارسال البريد يعمل بشكل طبيعي. لكن يدون توقف بعد اضافة كود التعديل . سابقا كلن يبعث مرة واحدة.
شطرا لك مقدما
kira-h
02-04-2019, 10:42 PM
السلام عليكم
ارسال البريد يعمل بشكل طبيعي. لكن يدون توقف بعد اضافة كود التعديل . سابقا كلن يبعث مرة واحدة.
شطرا لك مقدما
وعليكم السلام
الكود سليم منطقيا وسيرسل الرسالة مرتين بشمعتين، ولكن ربما تضل شروط التنبيه محققة "StrToDouble" وسيرسل تنبيه كل شمعة
kira-h
02-04-2019, 10:46 PM
مفيش مشكله اخى انت تعبت معايا فى الكود ده ربنا يوفقك ويجزيك كل خير على اللى بتعمله
اخر شيء احتاجه للكود ده
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0||(Closed("Profit")>=0&&profit<(TakeP-Gap)*point))NewLots=MathMin(NormalizeDouble(Closed ("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
هذا التعديل سوف يقلل من المضاعفات قليلاً
اوردر فتح 0.01 ضرب وقف الخسائر هيكمل مضاعفات
هيفتح اوردر 0.02 لو اغلق close على ربح وليس T/P
يفتح اوردر بنفس اللوت 0.02 تانى ولو ضرب وقف الخساره هيكمل مضاعفات
هيفتح اوردر 0.04 لو اغلق colse على خساره هيكمل مضاعفات
يعنى تكرار اللوت السابق فى حالة اغلاق الاوردر close على ربح وليس T/P
والمضاعفات هتبقا فى حالة اذا كان الاوردر close على خساره او S/L
واسف على التعديلات الكثيره ودا اخر تعديل فى الكود ده وشكراً لحضرتك وتعبتك معايا وربنا يجزيك كل خير
العفو أخي الكريم،
التعديل كالتالي:
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
شكراً لك اخى ربنا يوفقك ويجزيك كل خير
العفو أخي الكريم،
التعديل كالتالي:
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
sabil
03-04-2019, 02:50 AM
ستستخدم دالة الاستدعاء لخط من نوع اوبجكت ObjectGet
مثال :
دالة استدعاء سعر خط افقي باسم Line كالتالي:
double price=ObjectGet("Line",OBJPROP_PRICE1);
شرط الاختراق من اسفل الى اعلى كالتالي :
if(Close[1]<price&&Close[0]>=price)//...
عملت كل شيء ولكن الاكسبرت لا يعمل بشكل صحيح كلياً
سأشرح الشروط سريعا وبعدها ارفق الاكسبرت لتصحيح الاخطاء طبقا للشروط
1- استدعيت الخطوط الافقية الاربعة كالتالي :
up_candle
down_candle
up_macd
down_macd
2- شروط الدخول شراء
- عندما يكون السعر الحالي فوق/اكبر من الخط السفلى down_candle وقيمة الماكد اقل من الخط السفلي down_macd
- او عندما يكون السعر الحالي اقل من الخط السفلى down_candle وقيمة الماكد اكبر من الخط السفلى down_macd
3- شروط الدخول بيع
- عندما يكون السعر الحالي فوق/اكبر من الخط العلوي up_candle وقيمة الماكد اقل من الخط العلوي up_macd
- او عندما يكون السعر الحالي اقل من الخط العلوي up_candle وقيمة الماكد اكبر من الخط العلوي up_macd
4- هدف الصفقة
شراء : بحساب المسافة بين الخط العلوي up_candle وسعر الاسك
اما في حالة البيع : نحسب المسافة بين سعر العرض والخط السفلي down_candle
والقيمة الناتجة هي الهدف
5- واخيرا تحديد الاستوب
هي نفس قيمة نقاط الهدف
ملحوظة : قمت بتسمية الخطوط بنفس دوال الاستدعاء
والان جاء دور الاكسبرت وهو ف المرفقات
Mohamadsabry
03-04-2019, 12:04 PM
سلام عليكم يا اخي الكريم هذا اكسبريت اجتهدت في اكسبيرت لاصل للهدف المخفي لكن تظهر مع اخطاء ارجو اضافه الهدف والاستوب المخفي بالاضافه الي اضافه فكره جوهريه في الاكسبريت وهي فتح صفقه في كل ساعه اذا كانت الشمعه السابقه صاعده يكون امربيع واذا كانت الشمعه السابقه هابطه يفتح امر شراء بهدف نقطتين او ثلاثه +الاسبريد وارجو تحديد حد اعلي للصفقات المفتوحه كمتغير خارجي بحيث لاتزيد عن اثنين او ثلاثه مثلا قمت باضافه داله التوقيت لكني اريد العكس كالاتي اريد تحديد اوقات معينه لا يعمل بها الاكسبيرت خلال اليوم مثلا الاخبار والكوارث ساقوم بارفاق الاكسبيرت في المرفقات وارجو اذا به اخطاء برمجيه اخري تعديلها وجزاك الله خير . مقدما
Mohamadsabry
03-04-2019, 12:19 PM
تم تحميل الأكسبيرت و منتظر التعديل
اخى ينفع اضافة كود لأى اكسبيرت حتى الاكسبيرت يعمل على جميع الازواج بما فيهم الذهب 50 تعنى 50 نقطه ولا حاجه لكتابة 50 نقطه هكذا 500 للذهب مثلاً
اذا بينفع ياريت توضيح ذلك على كود الاكسبيرت ده
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input int StopL = 50;
input int TakeP = 50;
input int Gap = 50;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=true;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
kira-h
03-04-2019, 08:21 PM
اخى ينفع اضافة كود لأى اكسبيرت حتى الاكسبيرت يعمل على جميع الازواج بما فيهم الذهب 50 تعنى 50 نقطه ولا حاجه لكتابة 50 نقطه هكذا 500 للذهب مثلاً
اذا بينفع ياريت توضيح ذلك على كود الاكسبيرت ده
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 1;
input double Lots = 0.01;
input int StopL = 50;
input int TakeP = 50;
input int Gap = 50;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 5;
input bool CloseAtNext=true;
input int MagicNumber = 321;
double f1,f2,s1,s2,ma,Macd1,Macd2,Macd3,Macd4,Macd5;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
f2=iMA(Symbol(),0,15,0,0,0,2);//قيمة الموفينج السريع عند الشمعة 2
s1=iMA(Symbol(),0,95,0,0,0,1);//قيمة الموفينج البطيء عند الشمعة 1
s2=iMA(Symbol(),0,95,0,0,0,2);//قيمة الموفينج البطيء عند الشمعة 2
ma=iMA(Symbol(),0,150,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
Macd3=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3 );
Macd4=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,4 );
Macd5=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,5 );
//-------
if(CloseAtNext)
{
if(f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)CloseDeleteOrders(OP_SELL);
if(f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(((MaxTrades>0&&TotalOrders(OP_BUY)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1>s1&&f2<=s2&&f1>ma&&s1>ma&&Macd1>0&&Macd2>0&&Macd3>0&&Macd4>0&&Macd5>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(((MaxTrades>0&&TotalOrders(OP_SELL)<MaxTrades)||MaxTrades==0)&&time!=Time[0]
&&f1<s1&&f2>=s2&&f1<ma&&s1<ma&&Macd1<0&&Macd2<0&&Macd3<0&&Macd4<0&&Macd5<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
شرط قيمة النقطة لعملات والكروسات كالتالي :
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
_Digits وظيفة تعبر عن عدد الأرقام بعد الفاصلة افتراضيا لسعر الزوج
digits متغير صحيح يعبر عن عدد الأرقام بعد الفاصلة لسعر الزوج بناء على الشروط أعلاه للعملات والكروسات
point متغير عشري يعبر عن قيمة النقطة لسعر الزوج بناء على الشروط أعلاه للعملات والكروسات
ومنه يمكنك بناء شروط خاصة بك حسب الزوج والمنصة لديك
اللى انا شايفه ان الشروط صحيحه ان بكدا اقدر اكتب هدف او وقف خساره 50 بدل من 500 - الكلام على الذهب منصه 5 ارقام والدهب ارقامه بتكون بالشكل ده 1290.45
ولكن لما بكتب فى اعدادات الاكسبيرت 50 مش بيشتغل ولما بكتب 500 بيشتغل وبيحسب 500 انها 50 نقطه
شرط قيمة النقطة لعملات والكروسات كالتالي :
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
_Digits وظيفة تعبر عن عدد الأرقام بعد الفاصلة افتراضيا لسعر الزوج
digits متغير صحيح يعبر عن عدد الأرقام بعد الفاصلة لسعر الزوج بناء على الشروط أعلاه للعملات والكروسات
point متغير عشري يعبر عن قيمة النقطة لسعر الزوج بناء على الشروط أعلاق للعملات والكروسات
ومنه يمكنك بناء شروط خاصة بك حسب الزوج والمنصة لديك
kira-h
04-04-2019, 03:33 AM
اللى انا شايفه ان الشروط صحيحه ان بكدا اقدر اكتب هدف او وقف خساره 50 بدل من 500 - الكلام على الذهب منصه 5 ارقام والدهب ارقامه بتكون بالشكل ده 1290.45
ولكن لما بكتب فى اعدادات الاكسبيرت 50 مش بيشتغل ولما بكتب 500 بيشتغل وبيحسب 500 انها 50 نقطه
ليست لدي خبرة في الذهب وغيره من المعادن والأسهم
لكن كما قلت سابقا يمكنك بناء شروطك الخاصة لكل زوج خاص حسب خبرتك
والشروط واضحة وشرحتها بالتفصيل
أو يمكنك مباشرة اعتماد البوينت الافتراضي للمنصة Point، وبناءا عليه تضع عدد النقاط كاملة بالاعدادات مثلا 50 نقطة على اليورودولار تضع 500 (بمنصة 5 ارقام)
يعني بكل المعادلات الحسابية تغير point بالوظيفة الافتراضية Point
Mohamadsabry
04-04-2019, 09:48 AM
اخي ارجو الرد في تعديل الاكسبيرت انا كنت مشارك من قبل كثيرا في المنتدي لكن نسيت الباسورد لظروف قهريه وعملت ايميل جديد قريب من اسمي القديم
benaissa
04-04-2019, 05:10 PM
السلام عليكم ,أُستاذنا الكريم.
هل يمكن ان نضع بدل مضاعفات اللوت , مضاعفات الصفقات و ان يبقى اللوت ثابت, مثلا في مضاعفات التبريد : اذا خسرت صفقة عنما تتحقق شروط الشراء او البيع ,يفتح صفقتين و اِذا خسرتا يفتح 4 صفقات .... دون ان يتغير حجم اللوت .
شكرا أُستاذي.
شكراً لك اخى
ليست لدي خبرة في الذهب وغيره من المعادن والأسهم
لكن كما قلت سابقا يمكنك بناء شروطك الخاصة لكل زوج خاص حسب خبرتك
والشروط واضحة وشرحتها بالتفصيل
أو يمكنك مباشرة اعتماد البوينت الافتراضي للمنصة Point، وبناءا عليه تضع عدد النقاط كاملة بالاعدادات مثلا 50 نقطة على اليورودولار تضع 500 (بمنصة 5 ارقام)
يعني بكل المعادلات الحسابية تغير point بالوظيفة الافتراضية Point
kira-h
04-04-2019, 07:29 PM
اخي ارجو الرد في تعديل الاكسبيرت انا كنت مشارك من قبل كثيرا في المنتدي لكن نسيت الباسورد لظروف قهريه وعملت ايميل جديد قريب من اسمي القديم
قم باقتباس مشاركتك السابقة أو اكتب رقم المشاركة لمراجعتها
kira-h
04-04-2019, 07:37 PM
السلام عليكم ,أُستاذنا الكريم.
هل يمكن ان نضع بدل مضاعفات اللوت , مضاعفات الصفقات و ان يبقى اللوت ثابت, مثلا في مضاعفات التبريد : اذا خسرت صفقة عنما تتحقق شروط الشراء او البيع ,يفتح صفقتين و اِذا خسرتا يفتح 4 صفقات .... دون ان يتغير حجم اللوت .
شكرا أُستاذي.
وعليكم السلام
نعم ممكن، ويتم حفظ عدد الصفقات في كل مرحلة إما عن طريق دوال الجلوبال بعد دالة فتح الصفقة، أو من خلال مصفوفة مرتبطة بكومنت الصفقات
راجع ما يلي كأمثلة مشابهة :
دوال الجلوبال (https://www.fxprg.com/vb/showthread.php?t=31457&page=9&p=846193&viewfull=1#post846193)
مصفوفة المضاعفات الاختيارية
(https://www.fxprg.com/vb/showthread.php?t=31456&page=3&p=844598&viewfull=1#post844598)
m_nasseem
04-04-2019, 07:54 PM
السلام عليكم
تحياتي للقائمين علي المنتدي وبالاخص قسم الرد علي الاسئلة البرمجية
ارجو المساعدة
اسطر برمجية احصل من خلالها غلي سعر ask و bid لكل تكة عن فترة زمنية سابقة وليكن عن المدة من 1/1/2019 الساعة 01:40:20 حتي 15/2/2019 الساعة 22:30:55
ولكم مني جزيل الشكر
محمد
Mohamadsabry
04-04-2019, 09:08 PM
قم باقتباس مشاركتك السابقة أو اكتب رقم المشاركة لمراجعتها
اخي رقم المشاركه هي 2099+2098-ارجو الرد للضروره وجزاك الله خيرا
Ghassebd
04-04-2019, 11:01 PM
هل يوجد برنامج يحول من Ex4 to qm4 .
هل ممكن الحصول على نسخة
شكرا
kira-h
05-04-2019, 12:08 AM
هل يوجد برنامج يحول من Ex4 to qm4 .
هل ممكن الحصول على نسخة
شكرا
السلام عليكم
ضع طلبك بالقسم العام،
وغالبا لا يوجد حسب علمي
هنا الموضوع مخصص فقط للاسئلة البرمجية
kira-h
05-04-2019, 12:10 AM
السلام عليكم
تحياتي للقائمين علي المنتدي وبالاخص قسم الرد علي الاسئلة البرمجية
ارجو المساعدة
اسطر برمجية احصل من خلالها غلي سعر ask و bid لكل تكة عن فترة زمنية سابقة وليكن عن المدة من 1/1/2019 الساعة 01:40:20 حتي 15/2/2019 الساعة 22:30:55
ولكم مني جزيل الشكر
محمد
وعليكم السلام
حسب علمي غير ممكن معرفة اسعار التكات السابقة،
لكن يمكن فقط معرفة اسعار الاغلاق والفتح والهاي واللو
kira-h
05-04-2019, 12:14 AM
سلام عليكم يا اخي الكريم هذا اكسبريت اجتهدت في اكسبيرت لاصل للهدف المخفي لكن تظهر مع اخطاء ارجو اضافه الهدف والاستوب المخفي بالاضافه الي اضافه فكره جوهريه في الاكسبريت وهي فتح صفقه في كل ساعه اذا كانت الشمعه السابقه صاعده يكون امربيع واذا كانت الشمعه السابقه هابطه يفتح امر شراء بهدف نقطتين او ثلاثه +الاسبريد وارجو تحديد حد اعلي للصفقات المفتوحه كمتغير خارجي بحيث لاتزيد عن اثنين او ثلاثه مثلا قمت باضافه داله التوقيت لكني اريد العكس كالاتي اريد تحديد اوقات معينه لا يعمل بها الاكسبيرت خلال اليوم مثلا الاخبار والكوارث ساقوم بارفاق الاكسبيرت في المرفقات وارجو اذا به اخطاء برمجيه اخري تعديلها وجزاك الله خير . مقدما
تم تحميل الأكسبيرت و منتظر التعديل
وعليكم السلام
هذا طلب اكسبيرت! والموضوع هنا مخصص فقط للأسئلة البرمجية
يمكنك فتح موضوع جديد واشرح فيه كل التفاصيل
m_nasseem
05-04-2019, 12:36 AM
شكرا اخي حسن
سوف اتعامل مع تلك المعطيات بدل من السعر عند كل تكة
وسوف استخدم السعر عند قمم وقيعان الزجزاج ولكن كيف احصل علي التايم الخاص بالقمم والقيعان لاول قمة ولاول قاع للزجزاج
وعليكم السلام
حسب علمي غير ممكن معرفة اسعار التكات السابقة،
لكن يمكن فقط معرفة اسعار الاغلاق والفتح والهاي واللو
m_nasseem
05-04-2019, 01:00 AM
هل ممكن قراءه هذه البيانات الاسك والبيد لكل تكة من ملف هيستوري داتا للعملة
وعليكم السلام
حسب علمي غير ممكن معرفة اسعار التكات السابقة،
لكن يمكن فقط معرفة اسعار الاغلاق والفتح والهاي واللو
kira-h
05-04-2019, 04:40 AM
شكرا اخي حسن
سوف اتعامل مع تلك المعطيات بدل من السعر عند كل تكة
وسوف استخدم السعر عند قمم وقيعان الزجزاج ولكن كيف احصل علي التايم الخاص بالقمم والقيعان لاول قمة ولاول قاع للزجزاج
راجع المشاركة التالية
https://www.fxprg.com/vb/showthread.php?t=31457&page=121&p=881383&viewfull=1#post881383
هل ممكن قراءه هذه البيانات الاسك والبيد لكل تكة من ملف هيستوري داتا للعملة
لا يوجد بيانات الاسك بملف الهيستوري!
وغير ممكن الحصول على اسعار التكات الماضية باي وقت!، لان اصغر دقة للهيستوري بمنصة الميتا4 هي الدقيقة، بمعنى يمكنك الحصول فقط على سعر البيد لافتتاح او اغلاق او لو او هاي شمعة الدقيقة OHLC
اما سعر الاسك غير ممكن الا بافتراض سبريد ثابث باضافته الى سعر البيد
Mohamadsabry
05-04-2019, 07:09 AM
اخي هذا تعديل علي الاكسبيرت لان حاولت اضافه الكود تظهر لي اخطاء
Mohamadsabry
05-04-2019, 07:12 AM
وعليكم السلام
هذا طلب اكسبيرت! والموضوع هنا مخصص فقط للأسئلة البرمجية
يمكنك فتح موضوع جديد واشرح فيه كل التفاصيل
اخي هذا تعديل لاني حاولت اضافه الكود تظهر لي اخطاء اتمني تعديل الاكسبيرت او تعطني طريقه للتواصل معك للضروره لان الموضوع هام واعورني ع حاجتي و ربنا يجازيك خير
Mohamadsabry
05-04-2019, 09:13 AM
وعليكم السلام
هذا طلب اكسبيرت! والموضوع هنا مخصص فقط للأسئلة البرمجية
يمكنك فتح موضوع جديد واشرح فيه كل التفاصيل
اخي الكريم لقد فتحت موضوع جديد اذا تكرمت ممكن رد منك هنا او في الموضوع الجديد
Mohamadsabry
05-04-2019, 09:37 AM
وعليكم السلام
هذا طلب اكسبيرت! والموضوع هنا مخصص فقط للأسئلة البرمجية
يمكنك فتح موضوع جديد واشرح فيه كل التفاصيل
اخي اسم الموضوع الجديد اكسبيرت بهدف مخفي نقتطين
benaissa
05-04-2019, 10:31 AM
شكرا أخي وجزاك الله كل خير
اخى سمحنى رجعت محتاج مساعده لنفس كود المضاعفات اعذرنى
اذا فتح فى نفس الوقت قبل ضرب هدف او استوب اوردر 0.01 بيع وبعده اوردر 0.02 شراء والبيع 0.01 ضرب T/P الاول
الاوردر التالي بيكون 0.01 والمطلوب انه يكمل مضاعفات لان المطلوب هو T/P لأخر مضاعفه
انا عدلت على الكود بأضافة دالة LastOrder وعدلت الشرط ولكن لم احصل على المطلوب
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&LastOrder("Profit")>=(Gap)*point)))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
دالة LastOrder
double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime(),
cm=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="CloseTime")return(cm);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}
benaissa
06-04-2019, 03:15 PM
السلام عليكم الاخ الاستاذ حسن.
اطلب منك ان تشرح لي بعض الاشياء , اذا سمحت:
ما الفرق بين = و == .
ماذا تعني (NormalizeDouble(Ask,Digits .
ماذا تعني (if(OrderType()==type || type==-1.
اشكرك أُستاذي الكريم.
elhelaly
06-04-2019, 09:13 PM
استاذ حسن اتمنى الافاده فى التالي :-
1- لو انا عاوز افتح صفقه بيع اذا وصل السعر الى مستوى 50 فيبو
بفتح بيع فقط مره واحده يعنى لو السعر لمس الخط بفتح بيع اما هدف او ستوب طيب لو ضربت ستوب او هدف والسعر رجع مره اخرى
لا يفتح صفقه تانى من نفس المستوى خلال اليوم او الاسبوع
مثال للتوضيح
انا رسمت فيبو والسعر كان تحت مستوى ال 50 فيبو ثم ارتفع السعر ولمس الفيبو 50
تم فتح صفقه بيع ثم ذهب وجاب الهدف ثم عاد لمستوى فيبو 50 فى نفس اليوم انا بقي مش عاوزه يفتح صفقه تانيه فى نفس اليوم عند نفس المستوى
دى تبقى ازاى لو سمحت
kira-h
06-04-2019, 10:08 PM
السلام عليكم الاخ الاستاذ حسن.
اطلب منك ان تشرح لي بعض الاشياء , اذا سمحت:
ما الفرق بين = و == .
ماذا تعني (NormalizeDouble(Ask,Digits .
ماذا تعني (if(OrderType()==type || type==-1.
اشكرك أُستاذي الكريم.
وعليكم السلام
= نتيجة لمعادلة حسابية مثل x + y = 5
== شرط التساوي مثل إذا كان x يساوي y
if(x == y)
NormalizeDouble لتحديد عدد الأرقام بعد الفاصلة مثلا
NormalizeDouble(1.215468 , 2) = 1.21
Ask سعر الشراء "الأسك"
Digits العدد الافتراضي للأرقام بعد الفاصلة لسعر الزوج
type متغير صحيح يعبر عن نوع الصفقة، وإذا لم يتم تحديد نوع الصفقة يأخذ القيمة 1- افتراضيا أي الدالة تبحث في كل أنواع الصفقات
سمحنى اخى حسن
اخى سمحنى رجعت محتاج مساعده لنفس كود المضاعفات اعذرنى
اذا فتح فى نفس الوقت قبل ضرب هدف او استوب اوردر 0.01 بيع وبعده اوردر 0.02 شراء والبيع 0.01 ضرب T/P الاول
الاوردر التالي بيكون 0.01 والمطلوب انه يكمل مضاعفات لان المطلوب هو T/P لأخر مضاعفه
انا عدلت على الكود بأضافة دالة LastOrder وعدلت الشرط ولكن لم احصل على المطلوب
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&LastOrder("Profit")>=(Gap)*point)))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
دالة LastOrder
double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime(),
cm=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="CloseTime")return(cm);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}
benaissa
07-04-2019, 01:23 PM
وعليكم السلام
= نتيجة لمعادلة حسابية مثل x + y = 5
== شرط التساوي مثل إذا كان x يساوي y
if(x == y)
NormalizeDouble لتحديد عدد الأرقام بعد الفاصلة مثلا
NormalizeDouble(1.215468 , 2) = 1.21
Ask سعر الشراء "الأسك"
Digits العدد الافتراضي للأرقام بعد الفاصلة لسعر الزوج
type متغير صحيح يعبر عن نوع الصفقة، وإذا لم يتم تحديد نوع الصفقة يأخذ القيمة 1- افتراضيا أي الدالة تبحث في كل أنواع الصفقات
أشكرك جزيل الشكر أخي الكيم الاستاذ حسن.
elhelaly
07-04-2019, 06:11 PM
استاذ حسن لو سمحت احتاج للتالى :-
1-عمل تنبيه اذا السعر لمس خط او مستوى معين مرسوم على الشارت خط دعم او مقاومه والتنبيه يكون عند لمسه مره واحده فقط خلال الشمعه وليس بتكرار اللمس منعا للازعاج بسبب تكرار التنبيه
2- رسم سهم arrow للاعلى او للاسفل عند لمس السعر للمستوى اى ان لو الخط اعلى السعر والسعر صعد ولمسه يرسم سهم للاسفل يفيد البيع
والعكس فى حاله الشراء
والف شكر على مجهودك معنا للافاده جعله الله فى ميزان حسناتك اخى
kira-h
07-04-2019, 08:33 PM
استاذ حسن لو سمحت احتاج للتالى :-
1-عمل تنبيه اذا السعر لمس خط او مستوى معين مرسوم على الشارت خط دعم او مقاومه والتنبيه يكون عند لمسه مره واحده فقط خلال الشمعه وليس بتكرار اللمس منعا للازعاج بسبب تكرار التنبيه
2- رسم سهم arrow للاعلى او للاسفل عند لمس السعر للمستوى اى ان لو الخط اعلى السعر والسعر صعد ولمسه يرسم سهم للاسفل يفيد البيع
والعكس فى حاله الشراء
والف شكر على مجهودك معنا للافاده جعله الله فى ميزان حسناتك اخى
السلام عليكم
أخي الكريم الموضوع مخصص فقط للأسئلة البرمجية
عموما راجع المشاركة التالية كتطبيق عملي
مثال تطبيقي لعمل مؤشر اسهم لتقاطع موفينجين (https://www.fxprg.com/vb/showthread.php?t=31456&p=871631&viewfull=1#post871631)
elhelaly
07-04-2019, 09:35 PM
السلام عليكم
أخي الكريم الموضوع مخصص فقط للأسئلة البرمجية
عموما راجع المشاركة التالية كتطبيق عملي
مثال تطبيقي لعمل مؤشر اسهم لتقاطع موفينجين (https://www.fxprg.com/vb/showthread.php?t=31456&p=871631&viewfull=1#post871631)
اوك تمام اشكرك اخى ولا تآآخذنى
kira-h
08-04-2019, 04:53 AM
اخى سمحنى رجعت محتاج مساعده لنفس كود المضاعفات اعذرنى
اذا فتح فى نفس الوقت قبل ضرب هدف او استوب اوردر 0.01 بيع وبعده اوردر 0.02 شراء والبيع 0.01 ضرب T/P الاول
الاوردر التالي بيكون 0.01 والمطلوب انه يكمل مضاعفات لان المطلوب هو T/P لأخر مضاعفه
انا عدلت على الكود بأضافة دالة LastOrder وعدلت الشرط ولكن لم احصل على المطلوب
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&LastOrder("Profit")>=(Gap)*point)))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
دالة LastOrder
double LastOrder(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
pt=OrderProfit(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime om=OrderOpenTime(),
cm=OrderCloseTime();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="TP")return(tp);
else if(info=="SL")return(sl);
else if(info=="OpenTime")return(om);
else if(info=="CloseTime")return(cm);
else if(info=="Comment")return(mm);
}
}
}
return(0);
}
لن تحتاج لاي تعديل اصلا، لانه يوجد لديك مضاعفات الصفقة المفتوحة LotsMP2 بحيث يضاعف بناء على اخر صفقة مفتوحة
عندنا الشرط ده
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&Profit>=(Gap)*point)))NewLots=Lots;
انه اذا الهدف اكبر من gap يبداء من اول لوت والتعديل المطلوب انه اذا اخر مضاعفه اتفتحت اذا ضربت الهدف والهدف اكبر من gap يبداء من الاول
لن تحتاج لاي تعديل اصلا، لانه يوجد لديك مضاعفات الصفقة المفتوحة LotsMP2 بحيث يضاعف بناء على اخر صفقة مفتوحة
kira-h
09-04-2019, 01:59 AM
عندنا الشرط ده
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&Profit>=(Gap)*point)))NewLots=Lots;
انه اذا الهدف اكبر من gap يبداء من اول لوت والتعديل المطلوب انه اذا اخر مضاعفه اتفتحت اذا ضربت الهدف والهدف اكبر من gap يبداء من الاول
كالتالي:
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&LastOrder("Profit")>=(Takeprofit-Gap)*point)))NewLots=Lots;
gap هي مسافة القفزة السعرية أو السبريد الزائد عن الطبيعي المتوقع
مثلا gap=2 فيكون الهدف الفعلي Takeprofit-2
kira-h
09-04-2019, 02:00 AM
اوك تمام اشكرك اخى ولا تآآخذنى
بالتوفيق إن شاء الله
كالتالي:
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&LastOrder("Profit")>=(Takeprofit-Gap)*point)))NewLots=Lots;
gap هي مسافة القفزة السعرية أو السبريد الزائد عن الطبيعي المتوقع
مثلا gap=2 فيكون الهدف الفعلي Takeprofit-2
13152
LastOrder هو دا اللى انا كنت فكرت فيه وعملته بالفعل ولكن مش بيعمل المطلوب
الاوردر رقم 1 ضرب الهدف والاوردر رقم 2 ضرب استوب والاوردر 3 بداء من الاول وكان المفروض الاوردر رقم 3 يكمل على المضاعفات لان الاوردر اللى ضرب الهدف ليس الاخير وليس اخر مضاعفه ايه الخطأ فى الكود ده كدا ؟
kira-h
09-04-2019, 07:26 PM
13152
LastOrder هو دا اللى انا كنت فكرت فيه وعملته بالفعل ولكن مش بيعمل المطلوب
الاوردر رقم 1 ضرب الهدف والاوردر رقم 2 ضرب استوب والاوردر 3 بداء من الاول وكان المفروض الاوردر رقم 3 يكمل على المضاعفات لان الاوردر اللى ضرب الهدف ليس الاخير وليس اخر مضاعفه ايه الخطأ فى الكود ده كدا ؟
اخي الكريم لم افهم ماذا تريد بالضبط! كل مرة تضع تعديلات جديدة حتى اصبحت الشروط معقدة!
اشرح الفكرة بالتفصيل مع امثلة بالارقام وتضع كل احتمالات المضاعفات الممكنة
غير ذلك لا يمكنني المساعدة أكثر فالفكرة غير واضحة
اخي الكريم لم افهم ماذا تريد بالضبط! كل مرة تضع تعديلات جديدة حتى اصبحت الشروط معقدة!
اشرح الفكرة بالتفصيل مع امثلة بالارقام وتضع كل احتمالات المضاعفات الممكنة
غير ذلك لا يمكنني المساعدة أكثر فالفكرة غير واضحة
ماشى اخى هحاول فى الرد ده اشرح الفكره بشكل بسيط
شروط ان الاكسبيرت يبداء من اول لوت
اذا اخر اوردر تفعل ضرب t/p
او اذا اخر مضاعفه t/p
13158
شرح الصوره اوردر رقم 1 فتح 0.01 وبعده اوردر رقم 2 فتح 0.02
اللى حصل بعد كدا ان اوردر رقم 2 ضرب s/l وكان لسه اوردر رقم 1 شغال وبعد كدا اوردر رقم 1 ضرب t/p
والاكسبيرت فتح اوردر رقم 3 بلوت 0.01 عايز من حضرتك ان الاكسبيرت يبداء من اول لوت اذا كان اخر اوردر تفعل هو اللى t/p او اخر مضاعفه اتفتحت t/p
يعنى لو كان فى اوردر 0.01 مفتوح واوردر تانى فى نفس الوقت مفتوح 0.02
وال 0.02 ضرب استوب يبقا هيكمل مضاعفات حتى لو 0.01 ضرب هدف بعد او قبل استوب 0.02
يعنى عند فتح عقد جديد بمضاعفه جديده يبقا t/P العقد اللى قبله لا يهم
kira-h
11-04-2019, 01:29 AM
ماشى اخى هحاول فى الرد ده اشرح الفكره بشكل بسيط
شروط ان الاكسبيرت يبداء من اول لوت
اذا اخر اوردر تفعل ضرب t/p
او اذا اخر مضاعفه t/p
13158
شرح الصوره اوردر رقم 1 فتح 0.01 وبعده اوردر رقم 2 فتح 0.02
اللى حصل بعد كدا ان اوردر رقم 2 ضرب s/l وكان لسه اوردر رقم 1 شغال وبعد كدا اوردر رقم 1 ضرب t/p
والاكسبيرت فتح اوردر رقم 3 بلوت 0.01 عايز من حضرتك ان الاكسبيرت يبداء من اول لوت اذا كان اخر اوردر تفعل هو اللى t/p او اخر مضاعفه اتفتحت t/p
يعنى لو كان فى اوردر 0.01 مفتوح واوردر تانى فى نفس الوقت مفتوح 0.02
وال 0.02 ضرب استوب يبقا هيكمل مضاعفات حتى لو 0.01 ضرب هدف بعد او قبل استوب 0.02
يعنى عند فتح عقد جديد بمضاعفه جديده يبقا t/P العقد اللى قبله لا يهم
يعني تحتاج إلى دالة تعطيك وظائف الصفقة قبل الاخيرة وتقارنها مع وظائف الصفقة الأخيرة (مثل مقارنة حجم العقدين أو نتيجتهما أو معا)
الدالة كالتالي تعطيك حجم عقد أو نتيجة الصفقة قبل الاخيرة :
double SecondOrders(string info,int type=-1)
{
int cnt;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime tm=OrderOpenTime();
if(sy==Symbol()&&mn==MagicNo&&(ty==type||type==-1))
{
cnt++;
if(cnt>=2)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
}
}
}
return(0);
}
الكود ده محتاج اكتب مكان
SecondOrdersاذا اخر اوردر تفعل على المنصه ضرب T/P ان شاء الله نبداء من اول لوت
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&SecondOrders("")>=(Takeprofit-Gap)*point)))NewLots=Lots;
يعني تحتاج إلى دالة تعطيك وظائف الصفقة قبل الاخيرة وتقارنها مع وظائف الصفقة الأخيرة (مثل مقارنة حجم العقدين أو نتيجتهما أو معا)
الدالة كالتالي تعطيك حجم عقد أو نتيجة الصفقة قبل الاخيرة :
double SecondOrders(string info,int type=-1)
{
int cnt;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
tp=OrderTakeProfit(),
sl=OrderStopLoss();
datetime tm=OrderOpenTime();
if(sy==Symbol()&&mn==MagicNo&&(ty==type||type==-1))
{
cnt++;
if(cnt>=2)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
}
}
}
return(0);
}
ماشى اخى هحاول فى الرد ده اشرح الفكره بشكل بسيط
شروط ان الاكسبيرت يبداء من اول لوت
اذا اخر اوردر تفعل ضرب t/p
او اذا اخر مضاعفه t/p
13158
شرح الصوره اوردر رقم 1 فتح 0.01 وبعده اوردر رقم 2 فتح 0.02
اللى حصل بعد كدا ان اوردر رقم 2 ضرب s/l وكان لسه اوردر رقم 1 شغال وبعد كدا اوردر رقم 1 ضرب t/p
والاكسبيرت فتح اوردر رقم 3 بلوت 0.01 عايز من حضرتك ان الاكسبيرت يبداء من اول لوت اذا كان اخر اوردر تفعل هو اللى t/p او اخر مضاعفه اتفتحت t/p
يعنى لو كان فى اوردر 0.01 مفتوح واوردر تانى فى نفس الوقت مفتوح 0.02
وال 0.02 ضرب استوب يبقا هيكمل مضاعفات حتى لو 0.01 ضرب هدف بعد او قبل استوب 0.02
يعنى عند فتح عقد جديد بمضاعفه جديده يبقا t/P العقد اللى قبله لا يهم
خد بالك انا كتبت فى المشاركه فى النهايه ان العقد الى قبل الاخير لا يهمنا فى شيء وحضرتك كتبت ليا دالة تعطينى معلومات عن العقد اللى قبل الاخير ؟
وكل اللى محتاجه منك ان تعرفنى ازي اعدل الشرط اللى هو اذا ضرب هدف بيبداء من الاول التعديل هيكون ان ضرب الهدف ولكن لأخر عقد تفعل او اخر مضاعفه اقراء المشاركه اللى فوق دى وانا كتبت فيها اكثر من مثال وشكراً لك
كل اللى محتاجه كتبته لك فى الشرط حتى يكون الامر اسهل
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&if last activated order hit T/p or last LotsMP1("Profit")>=(Takeprofit-Gap)*point)))NewLots=Lots;
اخى حتى اسهل عليك الموضوع انا محتاج دالة معرفة اخر اوردر تفعل last order opened
واقدر احدد انا عايز ايه من الداله هكذا
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
kira-h
11-04-2019, 04:44 AM
خد بالك انا كتبت فى المشاركه فى النهايه ان العقد الى قبل الاخير لا يهمنا فى شيء وحضرتك كتبت ليا دالة تعطينى معلومات عن العقد اللى قبل الاخير ؟
وكل اللى محتاجه منك ان تعرفنى ازي اعدل الشرط اللى هو اذا ضرب هدف بيبداء من الاول التعديل هيكون ان ضرب الهدف ولكن لأخر عقد تفعل او اخر مضاعفه اقراء المشاركه اللى فوق دى وانا كتبت فيها اكثر من مثال وشكراً لك
كل اللى محتاجه كتبته لك فى الشرط حتى يكون الامر اسهل
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&if last activated order hit T/p or last LotsMP1("Profit")>=(Takeprofit-Gap)*point)))NewLots=Lots;
كيف لا يهم نتيجة العقد الثاني وهو على اساس خسارته تريد مضاعفة الصفقة الجديدة!!
kira-h
11-04-2019, 04:46 AM
اخى حتى اسهل عليك الموضوع انا محتاج دالة معرفة اخر اوردر تفعل last order op٩ened
واقدر احدد انا عايز ايه من الداله هكذا
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
لا يوجد دالة كهذه فبمجرد اغلاق الصفقة يتغير كل شيء
ونوهت عن هذا سابقا
بالنسبة للمضاعفات مش مشكله هتكون عادى
اقصد
ان عندى اول اوردر 0.01 والتانى 0.02 لو التانى الى هو 0.02 ضرب استوب والى 0.01 ضرب هدف بعد استوب 0.02 كدا الاكسبيرت هيبداء من اول لوت 0.01 تانى وكدا الاكسبيرت هيكون فى خساره لان لوت 0.02 خسارته اكبر من لوت 0.01 طيب الحل ايه ؟
ان انا عايز الاكسبيرت يبداء من الاول بس اذا كان اخر اوردر اتفتح ضرب هدف طيب لو مفيش دالة لأخر اوردر تفعل فى اى حل اخر ؟
ان يكون فى دالة تعرف تفاصيل لوت كل اوردر بيتفتح وبناءً على اكبر لوت مفتوح اذا ضرب هدف يبداء من الاول 0.01 فى حاجة كده !
كيف لا يهم نتيجة العقد الثاني وهو على اساس خسارته تريد مضاعفة الصفقة الجديدة!!
?
بالنسبة للمضاعفات مش مشكله هتكون عادى
اقصد
ان عندى اول اوردر 0.01 والتانى 0.02 لو التانى الى هو 0.02 ضرب استوب والى 0.01 ضرب هدف بعد استوب 0.02 كدا الاكسبيرت هيبداء من اول لوت 0.01 تانى وكدا الاكسبيرت هيكون فى خساره لان لوت 0.02 خسارته اكبر من لوت 0.01 طيب الحل ايه ؟
ان انا عايز الاكسبيرت يبداء من الاول بس اذا كان اخر اوردر اتفتح ضرب هدف طيب لو مفيش دالة لأخر اوردر تفعل فى اى حل اخر ؟
ان يكون فى دالة تعرف تفاصيل لوت كل اوردر بيتفتح وبناءً على اكبر لوت مفتوح اذا ضرب هدف يبداء من الاول 0.01 فى حاجة كده !
kira-h
13-04-2019, 10:53 PM
بالنسبة للمضاعفات مش مشكله هتكون عادى
اقصد
ان عندى اول اوردر 0.01 والتانى 0.02 لو التانى الى هو 0.02 ضرب استوب والى 0.01 ضرب هدف بعد استوب 0.02 كدا الاكسبيرت هيبداء من اول لوت 0.01 تانى وكدا الاكسبيرت هيكون فى خساره لان لوت 0.02 خسارته اكبر من لوت 0.01 طيب الحل ايه ؟
ان انا عايز الاكسبيرت يبداء من الاول بس اذا كان اخر اوردر اتفتح ضرب هدف طيب لو مفيش دالة لأخر اوردر تفعل فى اى حل اخر ؟
ان يكون فى دالة تعرف تفاصيل لوت كل اوردر بيتفتح وبناءً على اكبر لوت مفتوح اذا ضرب هدف يبداء من الاول 0.01 فى حاجة كده !
اعتقد يوجد تناقض برمجي
عموما مرفق دالة تستخرج نتيجة آخر صفقة مغلقة بأكبر توقيت الفتح (الربح أو حجم العقد)
يعني مثلا في صفقة مغلقة بعقد 0.02 ثم يليه صفقة مغلقة بعقد 0.01 يعني صفقة 0.01 آخر صفقة مغلقة، ولكن من حيث الفتح كانت آخر صفقة مفتوحة هي 0.02 وبالتالي الدالة ستنظر فقط الى الصفقة 0.02 عند اغلاقها لأنها الاكبر زمنيا من حيث توقيت الفتح
double LastOrderClosed(string info)//نتيجة آخر صفقة مغلقة والاكبر من حيث توقيت الفتح
{
double c=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()<=OP_SELL)
{
if(OrderOpenTime()>c)c=OrderOpenTime();
if(OrderOpenTime()==c)
{
if(info=="Profit")return(OrderProfit());
else if(info=="Lots")return(OrderLots());
}
}
}
return(0);
}
شكراً لك اخى بتتعب معانا والله
اعتقد يوجد تناقض برمجي
عموما مرفق دالة تستخرج نتيجة آخر صفقة مغلقة بأكبر توقيت الفتح (الربح أو حجم العقد)
يعني مثلا في صفقة مغلقة بعقد 0.02 ثم يليه صفقة مغلقة بعقد 0.01 يعني صفقة 0.01 آخر صفقة مغلقة، ولكن من حيث الفتح كانت آخر صفقة مفتوحة هي 0.02 وبالتالي الدالة ستنظر فقط الى الصفقة 0.02 عند اغلاقها لأنها الاكبر زمنيا من حيث توقيت الفتح
double LastOrderClosed(string info)//نتيجة آخر صفقة مغلقة والاكبر من حيث توقيت الفتح
{
double c=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()<=OP_SELL)
{
if(OrderOpenTime()>c)c=OrderOpenTime();
if(OrderOpenTime()==c)
{
if(info=="Profit")return(OrderProfit());
else if(info=="Lots")return(OrderLots());
}
}
}
return(0);
}
اخى الشرط ده اللى هو اذا كان فى اوردر اغلق close او s/l على ربح الاوردر التالى هيكون بنفس اللوت للاوردر اللى اغلق على ربح فى حالة اذا كان الربح اقل من gap
الصوره هحصل غير كدا ده بسبب تأخر اغلاق الاوردر المفتوح ولا خطأ فى الشرط ؟
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
الكود كامل
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
kira-h
15-04-2019, 02:28 AM
اخى الشرط ده اللى هو اذا كان فى اوردر اغلق close او s/l على ربح الاوردر التالى هيكون بنفس اللوت للاوردر اللى اغلق على ربح فى حالة اذا كان الربح اقل من gap
الصوره هحصل غير كدا ده بسبب تأخر اغلاق الاوردر المفتوح ولا خطأ فى الشرط ؟
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
الكود كامل
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
نعم صحيح
sabil
16-04-2019, 09:02 PM
اخي حسن
من فضلك اريد مراجع عربية/اجنبية لتعليم برمجة الاكسبرتات والمؤشرات باللغتين mq4,mq5 من الصفر الى الاحتراف
ارجو الافادة
shivaa
16-04-2019, 11:28 PM
السلام عليكم
ممكن مساعده
عندى مشكله فى الاكسبيرت وهى
عندى صفقات معلقه buy وsell معلق على اكثر من زوج
اذا تفعل مثلا buyعلى احدى الازواج
يجب حزف sell والعكس
من على زوج ده فقط وليس من على كل الازواج
اكون شكر
kira-h
17-04-2019, 12:33 AM
اخي حسن
من فضلك اريد مراجع عربية/اجنبية لتعليم برمجة الاكسبرتات والمؤشرات باللغتين mq4,mq5 من الصفر الى الاحتراف
ارجو الافادة
السلام عليكم
المرجع الكامل في تعليم لغة mql4 (https://www.fxprg.com/vb/showthread.php?t=31458)
kira-h
17-04-2019, 12:37 AM
السلام عليكم
ممكن مساعده
عندى مشكله فى الاكسبيرت وهى
عندى صفقات معلقه buy وsell معلق على اكثر من زوج
اذا تفعل مثلا buyعلى احدى الازواج
يجب حزف sell والعكس
من على زوج ده فقط وليس من على كل الازواج
اكون شكر
وعليكم السلام
ستقوم بعمل شرط إذا يوجد صفقة شراء مفعلة يحذف الأوامر المعلقة العكسية، والعكس صحيح
مثال :
دالة عدد الصفقات المفتوحة كالتالي :
int Orderscnt(int type=-1)
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
ثم دالة اغلاق الصفقات كالتالي:
void CloseOrders(int type=-1)
{
bool select,close,del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo)
{
if(ot==type||type==-1)
{
if(ot==OP_BUY){close=OrderClose(tk,lo,Bid,50);}
if(ot==OP_SELL){close=OrderClose(tk,lo,Ask,50);}
if(ot>OP_SELL){del=OrderDelete(tk);}
}
}
}
}
فيكون شرط إغلاق الشراء المعلق عند تفعيل بيع كالتالي :
if(Orderscnt(OP_SELL)>0){CloseOrders(OP_BUYSTOP);CloseOrders(OP_BUYLIMIT );}
shivaa
17-04-2019, 02:55 PM
وعليكم السلام
ستقوم بعمل شرط إذا يوجد صفقة شراء مفعلة يحذف الأوامر المعلقة العكسية، والعكس صحيح
مثال :
دالة عدد الصفقات المفتوحة كالتالي :
int Orderscnt(int type=-1)
{
int cnt=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
ثم دالة اغلاق الصفقات كالتالي:
void CloseOrders(int type=-1)
{
bool select,close,del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo)
{
if(ot==type||type==-1)
{
if(ot==OP_BUY){close=OrderClose(tk,lo,Bid,50);}
if(ot==OP_SELL){close=OrderClose(tk,lo,Ask,50);}
if(ot>OP_SELL){del=OrderDelete(tk);}
}
}
}
}
فيكون شرط إغلاق الشراء المعلق عند تفعيل بيع كالتالي :
if(Orderscnt(OP_SELL)>0){CloseOrders(OP_BUYSTOP);CloseOrders(OP_BUYLIMIT );}
OrderDeleteالمشكله انه يحزف كل الصفقات المعلقه من نفس النوع على كل الازواج
انا عاوز على الزوج المفعل فقط وليس على كل الازواج
kira-h
17-04-2019, 03:22 PM
OrderDeleteالمشكله انه يحزف كل الصفقات المعلقه من نفس النوع على كل الازواج
انا عاوز على الزوج المفعل فقط وليس على كل الازواج
لا يمكن اخي فالدوال السابقة تعمل على الزوج اللي عليه الاكسبيرت فقط بل ومع شرط الماجك نمبر
الخطأ لديك في طريقتك بعمل الشروط
ارفق الكود للتصحيح
sabil
17-04-2019, 11:37 PM
السلام عليكم
المرجع الكامل في تعليم لغة mql4 (https://www.fxprg.com/vb/showthread.php?t=31458)
شكرا
صحيح
نسيت هذا الموضوع
طيب انا عايز مصادر للغة mq5 هل يوجد لديك؟
الكود كدا صح اخى حسن
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if((Closed("Profit")>=0 || Closed("SL")>=0)&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&profit>=(TakeP-Gap)*point)))NewLots=Lots;
}
else NewLots=Lots;
اذا الاوردر المغلق على ربح = او اكبر من 0 او الاوردر المغلق على ضرب استوب والاستوب = او اكبر من 0 يفتح نفس اللوت المغلق
كنت عايز اتأكد اذا كان الكود كدا صح ولا لا ؟
الغرض من اضافة SL لان لو استخدمت تريلنج استوب وحقق ربح بحجز الارباح يفتح نفس اللوت تانى
if((Closed("Profit")>=0 || Closed("SL")>=0)&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
وعايز اضافة شرط اخر اذا كان الايكوتى قبل فتح اول لوت $1000 وعند اغلاق اى اوردر على ربح وكان الايكوتى اعلى من 1000$ يبداء من اول لوت
اذا كان الايكوتى 1000 وحصل ان فى ربح والايكوتى اصبح 1010 وبداء من اول لوت 0.01 والايكوتى اصبح 1030 يبداء من اول لوت تانى وهكذا يعنى يتم حفظ اخر ايكوتى ويكمل عليه
kira-h
18-04-2019, 09:42 PM
شكرا
صحيح
نسيت هذا الموضوع
طيب انا عايز مصادر للغة mq5 هل يوجد لديك؟
يمكنك تحميل كتاب شامل للغة MQL5 بعدة لغات من الموقع الرسمي https://www.mql5.com/en/docs
13280
أما عربيا يمكن ان تجد بعض الشروحات باليوتيوب
Tarek987
19-04-2019, 12:40 PM
السلام عليكم حسن و الجميع.
انا عندي اكسبيرت يفتح مجموعة من الصفقات بيع و شراء و لكل مجموعة دائما يكون الكومنت نفسه للصفقات سواء كانت بيع او شراء، و لكل مجموعة لها كومنت محدد لصفقاتها.
المطلوب دالة تخبرني هل مجموع البروفيت للصفقات المفتوحة بدلالة اسم محدد هي على ربح (حتى ولو كان بسيط) بعد حساب السواب و الكومشين.
مثال:
عندنا صفقتين بيع
و صفقة واحدة شراء
و لهم نفس الكومنت، اريد من الدالة ان تخبرني بعد تحقق شروط محددة ان تخبرني هل البروفيت لهذه الصفقات الثلاثة على ربح بعد حساب السواب و الكومشن.
و بالنهاية الله يوفقك يا حسن و يرزقك رزقة انت تريدها من حيث لا تحتسب.
kira-h
19-04-2019, 05:33 PM
السلام عليكم حسن و الجميع.
انا عندي اكسبيرت يفتح مجموعة من الصفقات بيع و شراء و لكل مجموعة دائما يكون الكومنت نفسه للصفقات سواء كانت بيع او شراء، و لكل مجموعة لها كومنت محدد لصفقاتها.
المطلوب دالة تخبرني هل مجموع البروفيت للصفقات المفتوحة بدلالة اسم محدد هي على ربح (حتى ولو كان بسيط) بعد حساب السواب و الكومشين.
مثال:
عندنا صفقتين بيع
و صفقة واحدة شراء
و لهم نفس الكومنت، اريد من الدالة ان تخبرني بعد تحقق شروط محددة ان تخبرني هل البروفيت لهذه الصفقات الثلاثة على ربح بعد حساب السواب و الكومشن.
و بالنهاية الله يوفقك يا حسن و يرزقك رزقة انت تريدها من حيث لا تحتسب.
وعليكم السلام
دالة الربح بدلالة كومنت الصفقات كالتالي :
double Profit_USD(string comment,int type=-1)
{
double pts=0;
for(int i=0;i<OrdersTotal();i++)
{
bool s=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ot=OrderType();
double pt=OrderProfit(),
sw=OrderSwap(),
cm=OrderCommission();
if(sy==Symbol()&&mn==MagicNo&&(ot==type||type==-1))
{
StringReplace(mm,"[started/gap]","");
if(mm==comment)
{
pts+=pt+sw+cm;
}
}
}
return(pts);
}
مثلا صفقات ذات كومنت باسم EA1 سيكون ربحهم كالتالي :
Profit_USD("EA1");
Tarek987
19-04-2019, 06:03 PM
وعليكم السلام
دالة الربح بدلالة كومنت الصفقات كالتالي :
double Profit_USD(string comment,int type=-1)
{
double pts=0;
for(int i=0;i<OrdersTotal();i++)
{
bool s=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ot=OrderType();
double pt=OrderProfit(),
sw=OrderSwap(),
cm=OrderCommission();
if(sy==Symbol()&&mn==MagicNo&&(ot==type||type==-1))
{
StringReplace(mm,"[started/gap]","");
if(mm==comment)
{
pts+=pt+sw+cm;
}
}
}
return(pts);
}
مثلا صفقات ذات كومنت باسم EA1 سيكون ربحهم كالتالي :
Profit_USD("EA1");
الله يوفقك و يسعدك ... شكرا حسن
Tarek987
19-04-2019, 06:13 PM
حسن لو سمحت،
ممكن دالة تقوم باغلاق مجموعة محددة من الصفقات بدلالة الكومنت.
مثال:
عندي ٣ صفقات شراء
و واحدة بيع
و جميعهم لهم نفس الكومنت،
اريد من الدالة ان تغلقهم هم فقط.
و كالعادة الله ييسرلك امورك يا حسن و يوفقك.
كله فى ميزان حسناتك اخى حسن الله يوفقك انا عارف انى زهقتك بكود المضاعفات ده بس انشاء الله دى اخر مشاركه بخصوص الكود ده
اذا كنت بتشوف مشاركتى
الكود كدا صح اخى حسن
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if((Closed("Profit")>=0 || Closed("SL")>=0)&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&profit>=(TakeP-Gap)*point)))NewLots=Lots;
}
else NewLots=Lots;
اذا الاوردر المغلق على ربح = او اكبر من 0 او الاوردر المغلق على ضرب استوب والاستوب = او اكبر من 0 يفتح نفس اللوت المغلق
كنت عايز اتأكد اذا كان الكود كدا صح ولا لا ؟
الغرض من اضافة SL لان لو استخدمت تريلنج استوب وحقق ربح بحجز الارباح يفتح نفس اللوت تانى
if((Closed("Profit")>=0 || Closed("SL")>=0)&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
وعايز اضافة شرط اخر اذا كان الايكوتى قبل فتح اول لوت $1000 وعند اغلاق اى اوردر على ربح وكان الايكوتى اعلى من 1000$ يبداء من اول لوت
اذا كان الايكوتى 1000 وحصل ان فى ربح والايكوتى اصبح 1010 وبداء من اول لوت 0.01 والايكوتى اصبح 1030 يبداء من اول لوت تانى وهكذا يعنى يتم حفظ اخر ايكوتى ويكمل عليه
kira-h
19-04-2019, 09:52 PM
حسن لو سمحت،
ممكن دالة تقوم باغلاق مجموعة محددة من الصفقات بدلالة الكومنت.
مثال:
عندي ٣ صفقات شراء
و واحدة بيع
و جميعهم لهم نفس الكومنت،
اريد من الدالة ان تغلقهم هم فقط.
و كالعادة الله ييسرلك امورك يا حسن و يوفقك.
وإياك أخي الكريم
دالة الاغلاق بدلالة الكومنت كالتالي:
void CloseOrders(string comment,int type=-1)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo&&(ot==type||type==-1))
{
StringReplace(mm,"[started/gap]","");
if(mm==comment)
{
if(ot==OP_BUY)close=OrderClose(tk,lo,Bid,50);
if(ot==OP_SELL)close=OrderClose(tk,lo,Ask,50);
if(ot>OP_SELL)close=OrderDelete(tk);
}
}
}
}
kira-h
19-04-2019, 09:52 PM
كله فى ميزان حسناتك اخى حسن الله يوفقك انا عارف انى زهقتك بكود المضاعفات ده بس انشاء الله دى اخر مشاركه بخصوص الكود ده
اذا كنت بتشوف مشاركتى
وإياك أخي الكريم
بالتوفيق إن شاء الله
اخى حسن بعد اذنك
عندى شروط MaxTrades فى دالة الشراء وفى دالة البيع كده
if(TotalOrders(OP_BUY)<MaxTrades)
if(TotalOrders(OP_SELL)<MaxTrades)
انا عايز ان فى كل دالة على حدا اذا MaxTrades=10
عايز ان اذا اخر اوردر اتفعل من ال10 اوردرات حسب كل نوع على حدا اذا سعر الماركت عكس 100 نقطة عن اخر اوردر يبداء تانى يفتح 10 اوردرات وكل ما بعد سعر الماركت عن اخر اوردر تفعل من اخر 10 اوردرات يكرر نفس العملية
يعنى يكون MaxTrades متعلق ب Step كل ما تحقق يبداء تداول مره اخرى حتى اذا لم يتم اغلاق الاوردرات القديمه
kira-h
20-04-2019, 06:32 PM
اخى حسن بعد اذنك
عندى شروط MaxTrades فى دالة الشراء وفى دالة البيع كده
if(TotalOrders(OP_BUY)<MaxTrades)
if(TotalOrders(OP_SELL)<MaxTrades)
انا عايز ان فى كل دالة على حدا اذا MaxTrades=10
عايز ان اذا اخر اوردر اتفعل من ال10 اوردرات حسب كل نوع على حدا اذا سعر الماركت عكس 100 نقطة عن اخر اوردر يبداء تانى يفتح 10 اوردرات وكل ما بعد سعر الماركت عن اخر اوردر تفعل من اخر 10 اوردرات يكرر نفس العملية
يعنى يكون MaxTrades متعلق ب Step كل ما تحقق يبداء تداول مره اخرى حتى اذا لم يتم اغلاق الاوردرات القديمه
السلام عليكم
سنحتاج إلى مضاعفات الرقم MaxTrades وبالتالي سنستخدم مثلا حلقة بها عدد المضاعفات i مثلا من 1 إلى 20 (20 ضعف)
وستكون الشروط ضمن الحلقة كالتالي:
for(int i=1;i<=20;i++)
{
if(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point)
{
//open buy
}
if(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point)
{
//open sell
}
}
LastPrice سعر آخر صفقة مفتوحة حسب النوع
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
Tarek987
20-04-2019, 11:05 PM
وإياك أخي الكريم
دالة الاغلاق بدلالة الكومنت كالتالي:
void CloseOrders(string comment,int type=-1)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0&&sy==Symbol()&&mn==MagicNo&&(ot==type||type==-1))
{
StringReplace(mm,"[started/gap]","");
if(mm==comment)
{
if(ot==OP_BUY)close=OrderClose(tk,lo,Bid,50);
if(ot==OP_SELL)close=OrderClose(tk,lo,Ask,50);
if(ot>OP_SELL)close=OrderDelete(tk);
}
}
}
}
الله يعطيك القوة و العافية و الصحة...... مشكور اخ حسن
السلام عليكم
سنحتاج إلى مضاعفات الرقم MaxTrades وبالتالي سنستخدم مثلا حلقة بها عدد المضاعفات i مثلا من 1 إلى 20 (20 ضعف)
وستكون الشروط ضمن الحلقة كالتالي:
for(int i=1;i<=20;i++)
{
if(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point)
{
//open buy
}
if(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point)
{
//open sell
}
}
LastPrice سعر آخر صفقة مفتوحة حسب النوع
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNo)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
اخى حسن تم اضافة الكود فى دالة OnTick
واضافة الداله لمعرفة اخر صفقه حسب النوع
وتم مسح الشروط اللى كانت فى دالة البيع والشراء
بس الكود يفتح بستمرار صفقات والمطلوب انه يفتح 10 صفقات لكل نوع كحد اقصي ولو سعر الماركت عكس على اخر صفقه اتفتحت الاستيب يبداء تانى ان متاح الدخول ل 10 صفقات ويتوقف عن التداول حتى يعكس عن اخر صفقه الاستيب المحدد ويكون متاح التداول مره اخرى
اخى حسن تم اضافة الكود فى دالة OnTick
واضافة الداله لمعرفة اخر صفقه حسب النوع
وتم مسح الشروط اللى كانت فى دالة البيع والشراء
بس الكود يفتح بستمرار صفقات والمطلوب انه يفتح 10 صفقات لكل نوع كحد اقصي ولو سعر الماركت عكس على اخر صفقه اتفتحت الاستيب يبداء تانى ان متاح الدخول ل 10 صفقات ويتوقف عن التداول حتى يعكس عن اخر صفقه الاستيب المحدد ويكون متاح التداول مره اخرى
هو ده الكود اخى حسن انا مسحت اللى انا عملته لان لما جربت اضافة الكود فى دالة البيع والشراء لم يعمل
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 2;
input double Lots = 0.01;
input int StopL = 0;
input int TakeP = 50;
input int Gap = 5;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 0.01;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,ma,Macd1,Macd2;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
ma=iMA(Symbol(),0,100,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
//-------
if(CloseAtNext)
{
if(f1>ma&&Macd1>0&&Macd2>0)CloseDeleteOrders(OP_SELL);
if(f1<ma&&Macd1<0&&Macd2<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(TotalOrders(OP_BUY)<MaxTrades)
if(time!=Time[0]&&f1>ma&&Macd1>0&&Macd2>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(TotalOrders(OP_SELL)<MaxTrades)
if(time!=Time[0]&&f1<ma&&Macd1<0&&Macd2<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
السلام عليكم
كيف اجعل اللوت فى الاكسبيرت يكون بنسبة معينة من الحساب يعنى 1% من الحساب او 5% من الحساب
هذا لان احيانا الاهداف والستوبات تكون متغيرة ففى صفقة مثلا يكون الستوب فيها 20 نقطة وفى صفقة اخرى يكون 100 نقطة وانا اريد ان اجعل المخاطرة متساوية دائما
على سبيل المثال عندما يكون رصيد الحساب الف دولار ومطلوب ان تكون نسبة المخاطرة 5%
فعندما يكون الستوب 50 نقطة يتم الدخول النقطة بواحد دولار
وعندما يكون الستوب 25 نقطة يتم دخول الصفقة ب2 دولار
وعندما يكون الستوب 100 نقطة يتم دخول الصفقة بنصف دولار...وهكذا تكون المخاطرة متساوية فى كل الصفقات
تحياتى لك
kira-h
21-04-2019, 06:31 PM
هو ده الكود اخى حسن انا مسحت اللى انا عملته لان لما جربت اضافة الكود فى دالة البيع والشراء لم يعمل
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 2;
input double Lots = 0.01;
input int StopL = 0;
input int TakeP = 50;
input int Gap = 5;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 0.01;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,ma,Macd1,Macd2;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
ma=iMA(Symbol(),0,100,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
//-------
if(CloseAtNext)
{
if(f1>ma&&Macd1>0&&Macd2>0)CloseDeleteOrders(OP_SELL);
if(f1<ma&&Macd1<0&&Macd2<0)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
//--------------------Buy Order
if(TotalOrders(OP_BUY)<MaxTrades)
if(time!=Time[0]&&f1>ma&&Macd1>0&&Macd2>0)
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if(TotalOrders(OP_SELL)<MaxTrades)
if(time!=Time[0]&&f1<ma&&Macd1<0&&Macd2<0)
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
الشروط كالتالي:
for(int i=1;i<=20;i++)
{
//--------------------Buy Order
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&Macd1>0&&Macd2>0&&time!=Time[0])
||(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point))
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if((TotalOrders(OP_SELL)!=MaxTrades*i&&f1<ma&&Macd1<0&&Macd2<0&&time!=Time[0])
||(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point))
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
kira-h
21-04-2019, 06:33 PM
الله يعطيك القوة و العافية و الصحة...... مشكور اخ حسن
وإياك أخي الكريم
اخى حسن الكود لا يعمل بالشكل المطلوب
ارفقت صوره فيها كميه كبيره من الصفقات اتفتحت مع ان انا حددت MaxTrades=2 والStep=500 يعنى بين اخر صفقه تتفعل لازم يكون فى مسافة 500 نقطة عكس اتجاه الصفقه حتى يتداول تانى ولكن الاكسبيرت بيتداول بعدد كبير من الصفقات وانا حددت فى الاساس ان MaxTrades=2 ؟
شرحت على الشارت المطلوب عمله من الكود
عدد الصفقات MaxTrades=2
عدد النقاط المطلوب اذا عكسها الماركت عن اخر اوردر تفعل ثم بعدها يتم التداول لصفقتين مره اخرى وتتكرر العمليه بستمرار Step=500
الشروط كالتالي:
for(int i=1;i<=20;i++)
{
//--------------------Buy Order
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&Macd1>0&&Macd2>0&&time!=Time[0])
||(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point))
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if((TotalOrders(OP_SELL)!=MaxTrades*i&&f1<ma&&Macd1<0&&Macd2<0&&time!=Time[0])
||(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point))
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
kira-h
21-04-2019, 08:11 PM
اخى حسن الكود لا يعمل بالشكل المطلوب
ارفقت صوره فيها كميه كبيره من الصفقات اتفتحت مع ان انا حددت MaxTrades=2 والStep=500 يعنى بين اخر صفقه تتفعل لازم يكون فى مسافة 500 نقطة عكس اتجاه الصفقه حتى يتداول تانى ولكن الاكسبيرت بيتداول بعدد كبير من الصفقات وانا حددت فى الاساس ان MaxTrades=2 ؟
أخي الكريم قلت انك تريد فتح الصفقة رقم 10 مثلا كل ستيب معين يعني الصفقة 10 بعد مسافة ستيب و الصفقة 20 بمسافة ستيب وهكذا، معناه مضاعفات الرقم MaxTrades وهوا ما قمنا به بعمل MaxTrades*i وi يحمل الارقام من 1 إلى 20 (يعني 20 ضعف)
إذن فالشرط المضاف سليم
أما سبب تكرار الصفقات سيكون من الشروط الأساسية لفتح الصفقات تضل محققة بكل شمعة
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&Macd1>0&&Macd2>0&&time!=Time[0])
أخي الكريم قلت انك تريد فتح الصفقة رقم 10 مثلا كل ستيب معين يعني الصفقة 10 بعد مسافة ستيب و الصفقة 20 بمسافة ستيب وهكذا، معناه مضاعفات الرقم MaxTrades وهوا ما قمنا به بعمل MaxTrades*i وi يحمل الارقام من 1 إلى 20 (يعني 20 ضعف)
إذن فالشرط المضاف سليم
أما سبب تكرار الصفقات سيكون من الشروط الأساسية لفتح الصفقات تضل محققة بكل شمعة
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&Macd1>0&&Macd2>0&&time!=Time[0])
13305
لا اخى حسن اعتقد انك فهمت شرحى خطأ من البدايه
اللي عايزه شرحته فى الصوره
الشرح اختلف الان بدلاً من 10 صفقات وبعتقد لا يوجد فرق المهم تغير عدد الصفقات الى 2 صفقه مثلاً
اذا فتح صفقتين شراء كدا مش هيفتح اكثر منهم حتى يعكس عليهم Step اي كان 500 نقطه مثلاً بعد كدا هيكون متاح للتداول لصفقتين اخرتين ونفس العمليه دائماً تتكرر وفى البيع نفس الشيء
السلام عليكم
كيف اجعل اللوت فى الاكسبيرت يكون بنسبة معينة من الحساب يعنى 1% من الحساب او 5% من الحساب
هذا لان احيانا الاهداف والستوبات تكون متغيرة ففى صفقة مثلا يكون الستوب فيها 20 نقطة وفى صفقة اخرى يكون 100 نقطة وانا اريد ان اجعل المخاطرة متساوية دائما
على سبيل المثال عندما يكون رصيد الحساب الف دولار ومطلوب ان تكون نسبة المخاطرة 5%
فعندما يكون الستوب 50 نقطة يتم الدخول النقطة بواحد دولار
وعندما يكون الستوب 25 نقطة يتم دخول الصفقة ب2 دولار
وعندما يكون الستوب 100 نقطة يتم دخول الصفقة بنصف دولار...وهكذا تكون المخاطرة متساوية فى كل الصفقات
تحياتى لك
ارجو الاهتمام بمشاركتى واسف على الازعاج لقد حاولت عمل اكسبيرت واريد تطبيق طريقة المخاطرة المتساوية ولكن لا اعرف
void OnTick()
{double ma1,ma2,ma3,ma4,ma5,ma6;
double SL,TP;
ma1=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,1);
ma2=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,2);
ma3=iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,1);
ma4=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,0);
double Speed=MathAbs(ma3-Close[0])/Point;
Comment(Speed);
double speed2=Speed+400;
if(ma1>ma3&&ma1>ma2&&Close[2]>ma1&&Close[1]>ma1&&Close[0]<=ma4&&Close[0]>ma3&&orderstotal()<max)
{
SL=Ask-speed2*Point;
TP=Ask+speed2*Point;
OrderSend(Symbol(),OP_BUY,lots,Ask,3,SL,TP,"klk",MagicNumber,0,Blue);
}
kira-h
22-04-2019, 03:25 AM
السلام عليكم
كيف اجعل اللوت فى الاكسبيرت يكون بنسبة معينة من الحساب يعنى 1% من الحساب او 5% من الحساب
هذا لان احيانا الاهداف والستوبات تكون متغيرة ففى صفقة مثلا يكون الستوب فيها 20 نقطة وفى صفقة اخرى يكون 100 نقطة وانا اريد ان اجعل المخاطرة متساوية دائما
على سبيل المثال عندما يكون رصيد الحساب الف دولار ومطلوب ان تكون نسبة المخاطرة 5%
فعندما يكون الستوب 50 نقطة يتم الدخول النقطة بواحد دولار
وعندما يكون الستوب 25 نقطة يتم دخول الصفقة ب2 دولار
وعندما يكون الستوب 100 نقطة يتم دخول الصفقة بنصف دولار...وهكذا تكون المخاطرة متساوية فى كل الصفقات
تحياتى لك
وعليكم السلام
مثال :
if(Digits==5||Digits==3)Q=10;else Q=1;
pip_value=MarketInfo(Symbol(),MODE_TICKVALUE)*Q;
if(pip_value==0)pip_value=1;
double lots=NormalizeDouble(RiskToLoss/StopLoss/pip_value,2);
بحيث :
RiskToLoss الخسارة بالدولار التي تريد المخاطرة بها
StopLoss عدد نقاط الوقف
kira-h
22-04-2019, 03:33 AM
13305
لا اخى حسن اعتقد انك فهمت شرحى خطأ من البدايه
اللي عايزه شرحته فى الصوره
الشرح اختلف الان بدلاً من 10 صفقات وبعتقد لا يوجد فرق المهم تغير عدد الصفقات الى 2 صفقه مثلاً
اذا فتح صفقتين شراء كدا مش هيفتح اكثر منهم حتى يعكس عليهم Step اي كان 500 نقطه مثلاً بعد كدا هيكون متاح للتداول لصفقتين اخرتين ونفس العمليه دائماً تتكرر وفى البيع نفس الشيء
الشروط صحيحة، ستضع فقط MaxTrades=2
الوقتى اذا انا حددت MaxTrades = 2
مش كدا الاكسبيرت لازم ميفتحش اكتر من صفقتين حتى اذا كان فى شروط تحققت مش هيتداول لان ماكس تريد 2 وهتيجاهل اى اشارة حتى يعكس 500 نقطه وبعد كدا يبداء يتداول ؟
الكود يفتح صفقات كتير ومش بيعمل المطلوب ؟ ايه الخطأ فى كدا
والصوره اللى شرحت فيها المطلوب من الكود عمله مرفقه
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 2;
input int Step = 500;
input double Lots = 0.01;
input int StopL = 0;
input int TakeP = 50;
input int Gap = 5;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 0.01;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,ma;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
ma=iMA(Symbol(),0,100,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
//-------
if(CloseAtNext)
{
if(f1>ma)CloseDeleteOrders(OP_SELL);
if(f1<ma)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
for(int i=1;i<=20;i++)
{
//--------------------Buy Order
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&time!=Time[0])
||(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point))
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if((TotalOrders(OP_SELL)!=MaxTrades*i&&f1<ma&&time!=Time[0])
||(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point))
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
sabil
23-04-2019, 12:49 AM
اعتذر منك اخي حسن عن وضع طلبي هنا
ولكن هو طلب تعديل بسيط جدا ع مؤشر
هو يظهر سهم عند كل شمعة تحققت فيها الشروط سواء شراء او بيع
المطلوب
ظهور سهم واحد فقط عند الشراء
وسهم واحد عند البيع
kira-h
23-04-2019, 05:27 PM
اعتذر منك اخي حسن عن وضع طلبي هنا
ولكن هو طلب تعديل بسيط جدا ع مؤشر
هو يظهر سهم عند كل شمعة تحققت فيها الشروط سواء شراء او بيع
المطلوب
ظهور سهم واحد فقط عند الشراء
وسهم واحد عند البيع
السلام عليكم
الاشارات سليمة لأن الشروط تتحقق بتلك الشموع
ولتقليل عدد الاشارات المتكررة إما تضع شرط عكسي عند الشمعة 2 (تقاطع أو اختراق...)
أو تضع اشارات اسهم تبادلية (بالمرفق)
sabil
23-04-2019, 07:38 PM
السلام عليكم
الاشارات سليمة لأن الشروط تتحقق بتلك الشموع
ولتقليل عدد الاشارات المتكررة إما تضع شرط عكسي عند الشمعة 2 (تقاطع أو اختراق...)
أو تضع اشارات اسهم تبادلية (بالمرفق)
شكراً اخي حسن
شغال تمام
كنت اظن انه هيكون خفيف اكتر ف الباكتيست عند تقليل الاسهم ولكن واقع الامر انه اصبح اكثر ثقلاً
لا اعلم ما السبب
كيف يمكن جعل المؤشر خفيفاً ف الباكتيسيت وجعل الشارت يتحرك بسرعة؟
kira-h
23-04-2019, 10:58 PM
شكراً اخي حسن
شغال تمام
كنت اظن انه هيكون خفيف اكتر ف الباكتيست عند تقليل الاسهم ولكن واقع الامر انه اصبح اكثر ثقلاً
لا اعلم ما السبب
كيف يمكن جعل المؤشر خفيفاً ف الباكتيسيت وجعل الشارت يتحرك بسرعة؟
يمكن التخفيف بتقليل عدد الشموع السابقة لظهور الاشارات BarsBack، والمؤشرات والشروط المستخدمة
ويمكنك اعتماد مبدئيا باكتيست الاغلاقات open price عوض التكي every tick
اخ حسن انتظرت ردك ؟
الوقتى اذا انا حددت MaxTrades = 2
مش كدا الاكسبيرت لازم ميفتحش اكتر من صفقتين حتى اذا كان فى شروط تحققت مش هيتداول لان ماكس تريد 2 وهتيجاهل اى اشارة حتى يعكس 500 نقطه وبعد كدا يبداء يتداول ؟
الكود يفتح صفقات كتير ومش بيعمل المطلوب ؟ ايه الخطأ فى كدا
والصوره اللى شرحت فيها المطلوب من الكود عمله مرفقه
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 2;
input int Step = 500;
input double Lots = 0.01;
input int StopL = 0;
input int TakeP = 50;
input int Gap = 5;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 0.01;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,ma;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
ma=iMA(Symbol(),0,100,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
//-------
if(CloseAtNext)
{
if(f1>ma)CloseDeleteOrders(OP_SELL);
if(f1<ma)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
for(int i=1;i<=20;i++)
{
//--------------------Buy Order
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&time!=Time[0])
||(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point))
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if((TotalOrders(OP_SELL)!=MaxTrades*i&&f1<ma&&time!=Time[0])
||(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point))
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
shivaa
24-04-2019, 05:33 PM
لا يمكن اخي فالدوال السابقة تعمل على الزوج اللي عليه الاكسبيرت فقط بل ومع شرط الماجك نمبر
الخطأ لديك في طريقتك بعمل الشروط
ارفق الكود للتصحيح
السلام عليكم
مرفق دوال حزف حسب Magicnumber
Delete_Order_BUYSTOP :-
//+------------------------------------------------------------------+
//| Delete_Order_BUYSTOP |
//+------------------------------------------------------------------+
void Delete_BUYSTOP()
{
for(i=OrdersTotal(); i>=0; i--)
{
bool dl=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && Magicnumber==OrderMagicNumber() && (OrderType()==OP_BUYSTOP))
{
bool dll=OrderDelete(OrderTicket());
}
}
}
Delete_Order_SELLSTOP :-
//+------------------------------------------------------------------+
//| Delete_Order_SELLSTOP |
//+------------------------------------------------------------------+
void Delete_SELLSTOP()
{
for(i=OrdersTotal(); i>=0; i--)
{
bool dl=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && Magicnumber==OrderMagicNumber() && (OrderType()==OP_SELLSTOP))
{
bool dll=OrderDelete(OrderTicket());
}
}
}
هل ممكن نضيف خيار اخر يساعد فى عدم الحزف غير مفعل عليه صفقات
الرجاء كتابه الداله اكون شاكر
kira-h
24-04-2019, 06:20 PM
السلام عليكم
مرفق دوال حزف حسب Magicnumber
Delete_Order_BUYSTOP :-
//+------------------------------------------------------------------+
//| Delete_Order_BUYSTOP |
//+------------------------------------------------------------------+
void Delete_BUYSTOP()
{
for(i=OrdersTotal(); i>=0; i--)
{
bool dl=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && Magicnumber==OrderMagicNumber() && (OrderType()==OP_BUYSTOP))
{
bool dll=OrderDelete(OrderTicket());
}
}
}
Delete_Order_SELLSTOP :-
//+------------------------------------------------------------------+
//| Delete_Order_SELLSTOP |
//+------------------------------------------------------------------+
void Delete_SELLSTOP()
{
for(i=OrdersTotal(); i>=0; i--)
{
bool dl=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && Magicnumber==OrderMagicNumber() && (OrderType()==OP_SELLSTOP))
{
bool dll=OrderDelete(OrderTicket());
}
}
}
هل ممكن نضيف خيار اخر يساعد فى عدم الحزف غير مفعل عليه صفقات
الرجاء كتابه الداله اكون شاكر
وعليكم السلام
لم أفهم سؤالك أخي
هل ممكن نضيف خيار اخر يساعد فى عدم الحزف غير مفعل عليه صفقات !!
إذا لا تريد حذف الأوامر المعلقة لا تستخدم تلك الدوال
kira-h
24-04-2019, 06:23 PM
اخ حسن انتظرت ردك ؟
أخي الكريم لم اجد حل برمجي مناسب لما تريد
shivaa
24-04-2019, 06:53 PM
وعليكم السلام
لم أفهم سؤالك أخي
هل ممكن نضيف خيار اخر يساعد فى عدم الحزف غير مفعل عليه صفقات !!
إذا لا تريد حذف الأوامر المعلقة لا تستخدم تلك الدوال
السلام عليكم
الاكسبيرت الخاص بى يعمل على 28 زوج
اول الدخول دخول صفقه sell وصفقه buy معلق
اذا تفعل واحده يحزف الاخرى
ده المفروض
اما هو بيعمل :-
اذا تفعل صفقه على اى زوج يحزف كل الصفقات على كل الازواج يبداء من جديد
كدا هو لا يفعل غير حركات السريعه فقط
هل ممكن تكتب داله تحزف الصفقات المعالقه بداللت الكمنت او رقم التك
من غير حزف صفقات معلقه على ازواج اخرى
اكون شاكر
kira-h
24-04-2019, 07:10 PM
مرحبا اخوان كيف ممكن اضيف كود الى اكسبرت لكي تضهر صورة على شارت فور وضع اكسبرت لكي يعمل مثل لي في صورة
السلام عليكم
ستستخدم الوظيفة ObjectCreate لإنشاء كائن من نوع الكائن OBJ_BITMAP_LABEL
ثم تستخدم الوظيفة ObjectSetString من نوع OBJPROP_BMPFILE لرفع الصورة
مثال :
ObjectCreate(0, "logo", OBJ_BITMAP_LABEL, 0, 0, 0);
ObjectSetString(0, "logo", OBJPROP_BMPFILE, 0, "\\Images\\30x28.bmp");
sosobom
24-04-2019, 07:36 PM
السلام عليكم
ستستخدم الوظيفة ObjectCreate لإنشاء كائن من نوع الكائن OBJ_BITMAP_LABEL
ثم تستخدم الوظيفة ObjectSetString من نوع OBJPROP_BMPFILE لرفع الصورة
مثال :
ObjectCreate(0, "logo", OBJ_BITMAP_LABEL, 0, 0, 0);
ObjectSetString(0, "logo", OBJPROP_BMPFILE, 0, "\\Images\\30x28.bmp");
ممكن أعرف في أي مكان في كود حتى أضع هده أكواد
وعليكم السلام
مثال :
if(Digits==5||Digits==3)Q=10;else Q=1;
pip_value=MarketInfo(Symbol(),MODE_TICKVALUE)*Q;
if(pip_value==0)pip_value=1;
double lots=NormalizeDouble(RiskToLoss/StopLoss/pip_value,2);
بحيث :
RiskToLoss الخسارة بالدولار التي تريد المخاطرة بها
StopLoss عدد نقاط الوقف
شكرا جزيلا اخى العزيز وجزاك الله خيراً
shivaa
24-04-2019, 10:44 PM
السلام عليكم
الاكسبيرت الخاص بى يعمل على 28 زوج
اول الدخول دخول صفقه sell وصفقه buy معلق
اذا تفعل واحده يحزف الاخرى
ده المفروض
اما هو بيعمل :-
اذا تفعل صفقه على اى زوج يحزف كل الصفقات على كل الازواج يبداء من جديد
كدا هو لا يفعل غير حركات السريعه فقط
هل ممكن تكتب داله تحزف الصفقات المعالقه بداللت الكمنت او رقم التك
من غير حزف صفقات معلقه على ازواج اخرى
اكون شاكر
up
kira-h
25-04-2019, 02:16 AM
ممكن أعرف في أي مكان في كود حتى أضع هده أكواد
تضع الصورة من نوع bmp بالمجلد Images الخاص بالمتاتريدر 4
ثم تكتب اسم الصورة مكان 30x28 (لأنه مجرد مثال)
ثم تضع الكود ضمن الدالة الرئيسية OnTick أو start
kira-h
25-04-2019, 02:22 AM
السلام عليكم
الاكسبيرت الخاص بى يعمل على 28 زوج
اول الدخول دخول صفقه sell وصفقه buy معلق
اذا تفعل واحده يحزف الاخرى
ده المفروض
اما هو بيعمل :-
اذا تفعل صفقه على اى زوج يحزف كل الصفقات على كل الازواج يبداء من جديد
كدا هو لا يفعل غير حركات السريعه فقط
هل ممكن تكتب داله تحزف الصفقات المعالقه بداللت الكمنت او رقم التك
من غير حزف صفقات معلقه على ازواج اخرى
اكون شاكر
وعليكم السلام
إذا كان الاكسبيرت يعمل على الأزواج من شارت واحد فهذا شأن آخر
أما إذا كان الاكسبيرت يعمل على عدة شارتات للأزواج فدوالك السابقة سليمة، فقط ضع الشرط بشكل منطقي بحيث تقول له مثلا إذا يوجد أكثر من صفقة مفعلة يحذف الصفقة المعلقة وهكذا...
if(Orderscnt(OP_BUY)>0)DeleteSellStop();
يجب أن ترفق الكود (أو الاكسبيرت) للمراجعة
kira-h
25-04-2019, 02:25 AM
شكرا جزيلا اخى العزيز وجزاك الله خيراً
وإياك أخي الكريم
اخى حسن كنت عايز حاجه مهمه وبحثت على الانترنت عن اكواد اقدر استخدمها ولكن مفيش خالص
الكود ده عايز حلقة تعرف الايكويتى الحالى عند تشغيل الاكسبيرت وتخزينه
واذا الاكسبيرت حقق ربح بمقدار محدد $10 مثلا الاكسبيرت يغلق اى صفقات مفتوحه ويبداء من اول لوت 0.01
ويحفظ اخر اكويتى بعد الربح ويتم تخزينه على انه الايكويتى الحالى ويستمر على نفس العملية كل ما تحقق ربح يتم تحديث الاكويتى
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 2;
input int Step = 500;
input double Lots = 0.01;
input int StopL = 0;
input int TakeP = 50;
input int Gap = 5;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 0.01;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,ma;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
ma=iMA(Symbol(),0,100,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
//-------
if(CloseAtNext)
{
if(f1>ma)CloseDeleteOrders(OP_SELL);
if(f1<ma)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
for(int i=1;i<=20;i++)
{
//--------------------Buy Order
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&time!=Time[0])
||(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point))
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if((TotalOrders(OP_SELL)!=MaxTrades*i&&f1<ma&&time!=Time[0])
||(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point))
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
sosobom
25-04-2019, 03:51 PM
أخي kira
عملت كل ما كتبت لكن لم يشتغل
ساضع لك صورة واكسبيرت و ممكن تضع صورة في اكسبيرت شكراً
kira-h
26-04-2019, 02:54 AM
أخي kira
عملت كل ما كتبت لكن لم يشتغل
ساضع لك صورة واكسبيرت و ممكن تضع صورة في اكسبيرت شكراً
يجب ان تضع قياسات محددة للصورة
راجع المؤشر المرفق كمثال
kira-h
26-04-2019, 02:58 AM
اخى حسن كنت عايز حاجه مهمه وبحثت على الانترنت عن اكواد اقدر استخدمها ولكن مفيش خالص
الكود ده عايز حلقة تعرف الايكويتى الحالى عند تشغيل الاكسبيرت وتخزينه
واذا الاكسبيرت حقق ربح بمقدار محدد $10 مثلا الاكسبيرت يغلق اى صفقات مفتوحه ويبداء من اول لوت 0.01
ويحفظ اخر اكويتى بعد الربح ويتم تخزينه على انه الايكويتى الحالى ويستمر على نفس العملية كل ما تحقق ربح يتم تحديث الاكويتى
//+------------------------------------------------------------------+
//| Copyright 2019, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MaxTrades = 2;
input int Step = 500;
input double Lots = 0.01;
input int StopL = 0;
input int TakeP = 50;
input int Gap = 5;
input int LotsMP1 = 2;
input int LotsMP2 = 2;
input double MaxLots = 0.01;
input bool CloseAtNext=false;
input int MagicNumber = 321;
double f1,ma;
double SL,TP,NewLots;
double point;
int Q,digits;
datetime time=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(_Digits==5||_Digits==3)Q=10;else Q=1;
if(_Digits<4){point=0.01;digits=2;}else{point=0.0001;digits=4 ;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
f1=iMA(Symbol(),0,15,0,0,0,1);//قيمة الموفينج السريع عند الشمعة 1
ma=iMA(Symbol(),0,100,0,0,0,1);//قيمة موفينج الفلترة أو الترند
Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1 );
Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2 );
//-------
if(CloseAtNext)
{
if(f1>ma)CloseDeleteOrders(OP_SELL);
if(f1<ma)CloseDeleteOrders(OP_BUY);
}
//-------
if(LotsMP1>0)
{
double profit=MathAbs(Closed("OpenPrice")-Closed("ClosePrice"));
if(Closed("Profit")<0)NewLots=MathMin(NormalizeDouble(Closed("Lots")*LotsMP1,2),MarketInfo(Symbol(),MODE_MAXLOT));
if(Closed("Profit")>=0&&profit<(TakeP-Gap)*point)NewLots=Closed("Lots");
if(Closed("Profit")>=0&&(HistoryOrders()==0||(HistoryOrders()>0&&(profit>=(TakeP-Gap)*point))))NewLots=Lots;
}
else NewLots=Lots;
if(TotalOrders()>0)
{
if(LotsMP2>0)
{
NewLots=MathMin(NormalizeDouble(CurrentLots()*Lots MP2,2),MarketInfo(Symbol(),MODE_MAXLOT));
}
else NewLots=Lots;
}
if(MaxLots>0&&NewLots>=MaxLots)NewLots=Lots;
for(int i=1;i<=20;i++)
{
//--------------------Buy Order
if((TotalOrders(OP_BUY)!=MaxTrades*i&&f1>ma&&time!=Time[0])
||(TotalOrders(OP_BUY)==MaxTrades*i&&Ask<=LastPrice(OP_BUY)-Step*point))
{
if(StopL!=0){SL=Ask-StopL*point;}else SL=0;
if(TakeP!=0){TP=Ask+TakeP*point;}else TP=0;
int BuyOrder=OrderSend(Symbol(),OP_BUY,NewLots,Ask,3*Q ,SL,TP,"",MagicNumber,0,Blue);
if(BuyOrder>0)time=Time[0];
}
//--------------------Sell Order
if((TotalOrders(OP_SELL)!=MaxTrades*i&&f1<ma&&time!=Time[0])
||(TotalOrders(OP_SELL)==MaxTrades*i&&Bid>=LastPrice(OP_SELL)+Step*point))
{
if(StopL!=0){SL=Bid+StopL*point;}else SL=0;
if(TakeP!=0){TP=Bid-TakeP*point;}else TP=0;
int SellOrder=OrderSend(Symbol(),OP_SELL,NewLots,Bid,3 *Q,SL,TP,"",MagicNumber,0,Red);
if(SellOrder>0)time=Time[0];
}
}
}
int TotalOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
int HistoryOrders(int type=-1)
{
int cnt=0;
for(int i =0;i<OrdersHistoryTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol()&&MagicNumber==OrderMagicNumber()&&(OrderType()==type||type==-1))
{
cnt++;
}
}
}
return(cnt);
}
double Closed(string info,int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots(),
pt=OrderProfit(),
op=OrderOpenPrice(),
cp=OrderClosePrice(),
tp=OrderTakeProfit();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
if(info=="Lots")return(lo);
else if(info=="Profit")return(pt);
else if(info=="Type")return(ty);
else if(info=="OpenPrice")return(op);
else if(info=="ClosePrice")return(cp);
else if(info=="TP")return(tp);
}
}
}
return(0);
}
double CurrentLots(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol(),
mm=OrderComment();
int mn=OrderMagicNumber(),
ty=OrderType();
double lo=OrderLots();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(lo);
}
}
}
return(0);
}
void CloseDeleteOrders(int type)
{
bool select,close;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrdersTotal()>0&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
if(OrderType()==type)
{
if(OrderType()==OP_BUY)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Bid,Digits),5*Q);
}
if(OrderType()==OP_SELL)
{
close=OrderClose(OrderTicket(),OrderLots(),Normali zeDouble(Ask,Digits),5*Q);
}
if(OrderType()>OP_SELL)
{
close=OrderDelete(OrderTicket());
}
}
}
}
double LastPrice(int type=-1)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double op=OrderOpenPrice();
if(sy==Symbol()&&mn==MagicNumber)
{
if(ty==type||type==-1)
{
return(op);
}
}
}
return(0);
}
ستستخدم دوال الجلوبال GlobalVariables لحفظ القيم بالحاسوب وليس فقط بالمنصة حتى لا يتم فقدانها عند اعادة تشغيل المنصة او الاكسبيرت
راجع ا لمشاركة التالية Global Variables (https://www.fxprg.com/vb/showthread.php?t=31457&page=9&p=846193&viewfull=1#post846193)
مثال :
if(EquityProfit>0)
{
if(OrdersTotal()==0)GlobalVariableDel("CloseAll");
if(GlobalVariableGet("Eq")==0||OrdersTotal()==0)GlobalVariableSet("Eq",AccountBalance()+EquityProfit);
if((OrdersTotal()>0&&GlobalVariableGet("Eq")>0&&AccountEquity()>=GlobalVariableGet("Eq"))||GlobalVariableGet("CloseAll")==10)
{
CloseAllOrders();
GlobalVariableSet("CloseAll",10);
}
if(GlobalVariableGet("CloseAll")==10)return;
}
بحيث CloseAllOrders دالة اغلاق جميع الصفقات لكل الأزواج كالتالي :
void CloseAllOrders(int type=-1)
{
bool select,close,del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0)
{
if(ot==type||type==-1)
{
if(ot==OP_BUY){close=OrderClose(tk,lo,MarketInfo(s y,MODE_BID),50);}
if(ot==OP_SELL){close=OrderClose(tk,lo,MarketInfo( sy,MODE_ASK),50);}
if(ot>OP_SELL){del=OrderDelete(tk);}
}
}
}
}
اشكرك اخى حسن على اخلاقك ومساعدتك لك منى كل الشكر والتقدير
ستستخدم دوال الجلوبال GlobalVariables لحفظ القيم بالحاسوب وليس فقط بالمنصة حتى لا يتم فقدانها عند اعادة تشغيل المنصة او الاكسبيرت
راجع ا لمشاركة التالية Global Variables (https://www.fxprg.com/vb/showthread.php?t=31457&page=9&p=846193&viewfull=1#post846193)
مثال :
if(EquityProfit>0)
{
if(OrdersTotal()==0)GlobalVariableDel("CloseAll");
if(GlobalVariableGet("Eq")==0||OrdersTotal()==0)GlobalVariableSet("Eq",AccountBalance()+EquityProfit);
if((OrdersTotal()>0&&GlobalVariableGet("Eq")>0&&AccountEquity()>=GlobalVariableGet("Eq"))||GlobalVariableGet("CloseAll")==10)
{
CloseAllOrders();
GlobalVariableSet("CloseAll",10);
}
if(GlobalVariableGet("CloseAll")==10)return;
}
بحيث CloseAllOrders دالة اغلاق جميع الصفقات لكل الأزواج كالتالي :
void CloseAllOrders(int type=-1)
{
bool select,close,del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
select=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
string sy=OrderSymbol();
int tt=OrdersTotal(),
tk=OrderTicket(),
ot=OrderType(),
mn=OrderMagicNumber();
double lo=OrderLots();
if(tt>0)
{
if(ot==type||type==-1)
{
if(ot==OP_BUY){close=OrderClose(tk,lo,MarketInfo(s y,MODE_BID),50);}
if(ot==OP_SELL){close=OrderClose(tk,lo,MarketInfo( sy,MODE_ASK),50);}
if(ot>OP_SELL){del=OrderDelete(tk);}
}
}
}
}
sosobom
26-04-2019, 04:03 PM
مرحباً أخي كيرا ممكن كود إنتهاء صلاحية اكسبيرت يعني لما أضع تاريخ مثلاً 2019.5.5 يتوقف اكسبيرت عن إشتغال تماماً
kira-h
26-04-2019, 05:59 PM
مرحباً أخي كيرا ممكن كود إنتهاء صلاحية اكسبيرت يعني لما أضع تاريخ مثلاً 2019.5.5 يتوقف اكسبيرت عن إشتغال تماماً
الكود كالتالي تضعه ببداية الدالة الرئيسية OnTick أو start
if(TimeCurrent()>=StrToTime("2019.05.05 00:00"))
{
Comment("EA Expired");
Alert("EA Expired");
return(0);
}
kira-h
26-04-2019, 06:00 PM
اشكرك اخى حسن على اخلاقك ومساعدتك لك منى كل الشكر والتقدير
العفو وبالتوفيق إن شاء الله
sabil
27-04-2019, 04:07 AM
اخي حسن
اريد دالة تعطي قيمة اخر صفقة اغلقت ع خسارة بالدولار
sabil
27-04-2019, 06:16 PM
اخي حسن
اريد دالة تعطي قيمة اخر صفقة اغلقت ع خسارة بالدولار
نسيت اذكر ان القيمة تكون بالموجب رغم انها صفقة خاسرة
لاني سأحتاجها في عملية رياضية
kira-h
27-04-2019, 08:10 PM
اخي حسن
اريد دالة تعطي قيمة اخر صفقة اغلقت ع خسارة بالدولار
نسيت اذكر ان القيمة تكون بالموجب رغم انها صفقة خاسرة
لاني سأحتاجها في عملية رياضية
السلام عليكم
الدالة كالتالي:
double LastProfit(int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double pt=OrderProfit(),
sw=OrderSwap(),
mm=OrderCommission();
if(sy==Symbol()&&mn==MagicNo&&(ty==type||type==-1))
{
return(MathAbs(pt+sw+mm));
}
}
return(0);
}
sabil
29-04-2019, 05:27 AM
السلام عليكم
الدالة كالتالي:
double LastProfit(int type=-1)
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
bool select=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
string sy=OrderSymbol();
int mn=OrderMagicNumber(),
ty=OrderType();
double pt=OrderProfit(),
sw=OrderSwap(),
mm=OrderCommission();
if(sy==Symbol()&&mn==MagicNo&&(ty==type||type==-1))
{
return(MathAbs(pt+sw+mm));
}
}
return(0);
}
شكراً ياغالي
تقريبا شغال مظبوط لسه مش متأكد
عشان عندي مشكلة ف تطبيق بعض الشروط
دالوقتي انا عامل شرطين داخل الاكسبرت واحد بيع / شراء مباشر واالتاني امر معلق شراء ليميت / بيع ليميت
اانا بقى عايزه بعد ما يفعل الامر المعلق ما يفتحش صفقات تاني طبقاا لشروط االامر المعلق بل نجعله يخضع لشروط الاوردر المباشرر فقط
المشكلة الل بتحصل عندي انه لما بيفعل الامر المعلق بيصبح عدد الاوامر المعلقة صفر وبالتالي يعيد فتحه مرة اخرى
كيف يتم تقييده بشروط الاوردر المباشر؟
جربت احط نفس شرووط االاوردرر المباشر لم ينفع
زي كده
الاوردر المباشر
if(Orderscnt(OP_SELL)==0&&L0>K0&&L1>K1&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
الاوردر المعلق
if(Orderscnt(OP_SELL)==1&&Orderscnt(OP_SELLLIMIT)==0&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
والاخير لا يعمل ولا يفتح اوامر معلقة نهائي
ومجرد مسح هذذا االشرط
LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0
يعمل جيدا ولكن كما ذكرت يظل يفتح كل ما يفعل الاوردر وانا ااريد تقييده
kira-h
30-04-2019, 02:28 AM
شكراً ياغالي
تقريبا شغال مظبوط لسه مش متأكد
عشان عندي مشكلة ف تطبيق بعض الشروط
دالوقتي انا عامل شرطين داخل الاكسبرت واحد بيع / شراء مباشر واالتاني امر معلق شراء ليميت / بيع ليميت
اانا بقى عايزه بعد ما يفعل الامر المعلق ما يفتحش صفقات تاني طبقاا لشروط االامر المعلق بل نجعله يخضع لشروط الاوردر المباشرر فقط
المشكلة الل بتحصل عندي انه لما بيفعل الامر المعلق بيصبح عدد الاوامر المعلقة صفر وبالتالي يعيد فتحه مرة اخرى
كيف يتم تقييده بشروط الاوردر المباشر؟
جربت احط نفس شرووط االاوردرر المباشر لم ينفع
زي كده
الاوردر المباشر
if(Orderscnt(OP_SELL)==0&&L0>K0&&L1>K1&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
الاوردر المعلق
if(Orderscnt(OP_SELL)==1&&Orderscnt(OP_SELLLIMIT)==0&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
والاخير لا يعمل ولا يفتح اوامر معلقة نهائي
ومجرد مسح هذذا االشرط
LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0
يعمل جيدا ولكن كما ذكرت يظل يفتح كل ما يفعل الاوردر وانا ااريد تقييده
شرط الصفقة المعلقة صحيح
وضح الشروط مع دالة فتح الصقة يعني الحلقة كاملة، فقد يكون السبب من LastSignal
sabil
30-04-2019, 07:14 AM
شرط الصفقة المعلقة صحيح
وضح الشروط مع دالة فتح الصقة يعني الحلقة كاملة، فقد يكون السبب من LastSignal
//-----------------------BUY Order1
if(Orderscnt(OP_BUY)==0&&H0<K0&&H1<K1&&LastSignal()==-1&&ch(0,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLb1=Ask-Stoploss*point;}else SLb1=0;
int b=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lotsbu y,Lot_Decimal),NormalizeDouble(Ask,Digits),3*Q,0,0 ,"aymoon",MagicNo,0,Blue);
time=Time[0];
}
}
//-----------------------SELL Order1
if(Orderscnt(OP_SELL)==0&&L0>K0&&L1>K1&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLs1=Bid+Stoploss*point;}else SLs1=0;
int s=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lotss ell,Lot_Decimal),NormalizeDouble(Bid,Digits),3*Q,0 ,0,"aymoon",MagicNo,0,Red);
time=Time[0];
}
}
//-----------------------BUY Order2
if(Orderscnt(OP_BUY)==1&&Orderscnt(OP_BUYLIMIT)==0&&LastSignal()==-1&&ch(0,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLb2=sellstop-Stoploss*point;}else SLb2=0;
int b2=OrderSend(Symbol(),OP_BUYLIMIT,NewLotsbuy*2,Nor malizeDouble(buylimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Blue);
time=Time[0];
}
}
//-----------------------SELL Order2
if(Orderscnt(OP_SELL)==1&&Orderscnt(OP_SELLLIMIT)==0&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLs2=buystop+Stoploss*point;}else SLs2=0;
int s2=OrderSend(Symbol(),OP_SELLLIMIT,NewLotssell*2,N ormalizeDouble(selllimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Red);
time=Time[0];
}
}
kira-h
30-04-2019, 11:29 PM
//-----------------------BUY Order1
if(Orderscnt(OP_BUY)==0&&H0<K0&&H1<K1&&LastSignal()==-1&&ch(0,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLb1=Ask-Stoploss*point;}else SLb1=0;
int b=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lotsbu y,Lot_Decimal),NormalizeDouble(Ask,Digits),3*Q,0,0 ,"aymoon",MagicNo,0,Blue);
time=Time[0];
}
}
//-----------------------SELL Order1
if(Orderscnt(OP_SELL)==0&&L0>K0&&L1>K1&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLs1=Bid+Stoploss*point;}else SLs1=0;
int s=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lotss ell,Lot_Decimal),NormalizeDouble(Bid,Digits),3*Q,0 ,0,"aymoon",MagicNo,0,Red);
time=Time[0];
}
}
//-----------------------BUY Order2
if(Orderscnt(OP_BUY)==1&&Orderscnt(OP_BUYLIMIT)==0&&LastSignal()==-1&&ch(0,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLb2=sellstop-Stoploss*point;}else SLb2=0;
int b2=OrderSend(Symbol(),OP_BUYLIMIT,NewLotsbuy*2,Nor malizeDouble(buylimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Blue);
time=Time[0];
}
}
//-----------------------SELL Order2
if(Orderscnt(OP_SELL)==1&&Orderscnt(OP_SELLLIMIT)==0&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
{
if(time!=Time[0])
{
//if(Stoploss!=0){double SLs2=buystop+Stoploss*point;}else SLs2=0;
int s2=OrderSend(Symbol(),OP_SELLLIMIT,NewLotssell*2,N ormalizeDouble(selllimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Red);
time=Time[0];
}
}
جرب التالي:
//-----------------------BUY Order1
if(H0<K0&&H1<K1&&LastSignal()==-1&&ch(0,1)!=0&&LastOrder("Profit")>=0)
{
if(Orderscnt(OP_BUY)==0&&time!=Time[0])
{
int b=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lotsbu y,Lot_Decimal),NormalizeDouble(Ask,Digits),3*Q,0,0 ,"aymoon",MagicNo,0,Blue);
int b2=OrderSend(Symbol(),OP_BUYLIMIT,NewLotsbuy*2,Nor malizeDouble(buylimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Blue);
time=Time[0];
}
}
//-----------------------SELL Order1
if(L0>K0&&L1>K1&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
{
if(Orderscnt(OP_SELL)==0&&time!=Time[0])
{
int s=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lotss ell,Lot_Decimal),NormalizeDouble(Bid,Digits),3*Q,0 ,0,"aymoon",MagicNo,0,Red);
int s2=OrderSend(Symbol(),OP_SELLLIMIT,NewLotssell*2,N ormalizeDouble(selllimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Red);
time=Time[0];
}
}
sabil
01-05-2019, 07:51 AM
جرب التالي:
//-----------------------BUY Order1
if(H0<K0&&H1<K1&&LastSignal()==-1&&ch(0,1)!=0&&LastOrder("Profit")>=0)
{
if(Orderscnt(OP_BUY)==0&&time!=Time[0])
{
int b=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lotsbu y,Lot_Decimal),NormalizeDouble(Ask,Digits),3*Q,0,0 ,"aymoon",MagicNo,0,Blue);
int b2=OrderSend(Symbol(),OP_BUYLIMIT,NewLotsbuy*2,Nor malizeDouble(buylimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Blue);
time=Time[0];
}
}
//-----------------------SELL Order1
if(L0>K0&&L1>K1&&LastSignal()==1&&ch(1,1)!=0&&LastOrder("Profit")>=0)
{
if(Orderscnt(OP_SELL)==0&&time!=Time[0])
{
int s=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lotss ell,Lot_Decimal),NormalizeDouble(Bid,Digits),3*Q,0 ,0,"aymoon",MagicNo,0,Red);
int s2=OrderSend(Symbol(),OP_SELLLIMIT,NewLotssell*2,N ormalizeDouble(selllimit,Digits),3*Q,0,0,"aymoon",MagicNo,0,Red);
time=Time[0];
}
}
شكرا ياغالي
لكن يبقى الوضع
الاوامر المعلقة لا تعمل
نريد حلاً
kira-h
01-05-2019, 02:01 PM
شكرا ياغالي
لكن يبقى الوضع
الاوامر المعلقة لا تعمل
نريد حلاً
ليست اوامر بل امر معلق وحيد يفتح مع الامر الماركت
ماهو الخطأ الذي يظهر بالجورنال ؟
sabil
01-05-2019, 06:06 PM
ليست اوامر بل امر معلق وحيد يفتح مع الامر الماركت
ماهو الخطأ الذي يظهر بالجورنال ؟
مفيش مشكلة مع الاوردرات المباشرة
ولكن الجورنال جايبلي خطأ ف اللوت للامر المعلق
kira-h
02-05-2019, 05:03 PM
مفيش مشكلة مع الاوردرات المباشرة
ولكن الجورنال جايبلي خطأ ف اللوت للامر المعلق
إذن ماهي شروط حجم عقد الأمر المعلق؟
sabil
02-05-2019, 08:02 PM
إذن ماهي شروط حجم عقد الأمر المعلق؟
شروط عقد الامر المعلق
if(Orderscnt(OP_SELL)>0)NewLotssell=LastOrderCurrent("Lots",OP_SELL);
if(Orderscnt(OP_BUY)>0)NewLotsbuy=LastOrderCurrent("Lots",OP_BUY);
شروط عقد الامر المباشر
double pipsbuy=(K0-Ask)/Point;
if(Tryy>0&&pipsbuy>0)double lotsbuy=(Balance/Tryy/pipsbuy);
double pipssell=(Bid-K0)/Point;
if(Tryy>0&&pipssell>0)double lotssell=(Balance/Tryy/pipssell);
benaissa
03-05-2019, 01:29 PM
السلام عليكم الأخ حسن .
من فضلك ماهو الفرق بين value و start عند اِدخال الاعدادات لتجربة اكسبيرت ما؟
و كيف يمكننا ملأها بشكل صحيح؟
شكرا على مساعدتك.
kira-h
03-05-2019, 10:26 PM
السلام عليكم الأخ حسن .
من فضلك ماهو الفرق بين value و start عند اِدخال الاعدادات لتجربة اكسبيرت ما؟
و كيف يمكننا ملأها بشكل صحيح؟
شكرا على مساعدتك.
وعليكم السلام
هذه الخصائص خاصة بالاومتيميزايشن
راجع الشرح التالي
- شرح طريقة ضبط الاكسبيرت من خلال Optimization (https://www.fxprg.com/vb/showthread.php?t=31563&p=845841&viewfull=1#post845841)
benaissa
04-05-2019, 12:18 PM
وعليكم السلام
هذه الخصائص خاصة بالاومتيميزايشن
راجع الشرح التالي
- شرح طريقة ضبط الاكسبيرت من خلال Optimization (https://www.fxprg.com/vb/showthread.php?t=31563&p=845841&viewfull=1#post845841)
شكرا أستاذ .
kira-h
05-05-2019, 02:51 AM
شكرا أستاذ .
العفو أخي الكريم
mr.forex
07-05-2019, 10:05 AM
صباح النور أستاذ حسن ،،،كل عام وأنت بخير يا طيب
مالمقصود بـ mode ecn الموجود في إعدادات بعض الإكسبيرتات
حسب ما سمعت بأنه شئ متعلق بالوقف والهدف ولكن لا أملك المعلومة كاملة، وهل هناك شئ آخر غير الهدف والوقف !
kira-h
07-05-2019, 03:28 PM
صباح النور أستاذ حسن ،،،كل عام وأنت بخير يا طيب
مالمقصود بـ mode ecn الموجود في إعدادات بعض الإكسبيرتات
حسب ما سمعت بأنه شئ متعلق بالوقف والهدف ولكن لا أملك المعلومة كاملة، وهل هناك شئ آخر غير الهدف والوقف !
السلام عليكم
اذا كان البروكر من نوع ecn او stp يتم وضع الهدف والوقف بعد فتح الصفقة
واذا العكس يتم وضعهما مباشرة مع الصفقة
معظم بروكرات ال ecn اصبحت الان تضع الهدف والوقف تلقائيا بعد فتح الصفقة حتى لو وضعتهما مسبقا...
سابقا كان يتم رفض فتح الصفقة ( ولا زال ببعض البروكرات) لهذا توجد تلك الخاصية عند تفعيلها يقوم بها الاكسبيرت تلقائيا بوضعهما بعد الفتح
كل عام وانتم بخير
mr.forex
08-05-2019, 05:35 AM
السلام عليكم
اذا كان البروكر من نوع ecn او stp يتم وضع الهدف والوقف بعد فتح الصفقة
واذا العكس يتم وضعهما مباشرة مع الصفقة
معظم بروكرات ال ecn اصبحت الان تضع الهدف والوقف تلقائيا بعد فتح الصفقة حتى لو وضعتهما مسبقا...
سابقا كان يتم رفض فتح الصفقة ( ولا زال ببعض البروكرات) لهذا توجد تلك الخاصية عند تفعيلها يقوم بها الاكسبيرت تلقائيا بوضعهما بعد الفتح
كل عام وانتم بخير
يعطيك العافية أستاذنا
الكلام باللون الأحمر أنت تقصد حينما يضع البروكر الوقف والهدف تلقائيا بعد فتح الصفقة يكون بمقدار النقاط الذي أنا قمت بتحديدها مسبقا يعني ليست بمقدار نقاط على حسب إختيار البروكر
سؤالي ثاني
هل يوجد حد أدنى من النقاط للهدف والستوب والترلينج ستوب لا يجب أن يكون أقل منه لكي يقبله البروكر
مهم هذا السؤال وتفرق كثير في السكالبينج
رمضان كريم
mahmoud1111
08-05-2019, 06:37 PM
السلام عليكم استاذي
ممكن تساعدني في تعديل الاكسبيرت تبعي علما بانك صاحب الفضل الكبير في تعليمي للبرمجة
اريد وضع كود مضاعافات له
ثانيا
اريد خاصية تعديل الهدف لتلائم عدد الصفقات
مرفق الاكسبيرت
kira-h
08-05-2019, 07:31 PM
يعطيك العافية أستاذنا
الكلام باللون الأحمر أنت تقصد حينما يضع البروكر الوقف والهدف تلقائيا بعد فتح الصفقة يكون بمقدار النقاط الذي أنا قمت بتحديدها مسبقا يعني ليست بمقدار نقاط على حسب إختيار البروكر
سؤالي ثاني
هل يوجد حد أدنى من النقاط للهدف والستوب والترلينج ستوب لا يجب أن يكون أقل منه لكي يقبله البروكر
مهم هذا السؤال وتفرق كثير في السكالبينج
رمضان كريم
نعم، ولا يمكن ان يضع البروكر الهدف والوقف دون أمر منك !
أقل عدد النقاط المسموح به يختلف من بروكر لآخر، ويمكن معرفته من نافذة تنفيذ الأوامر كما بالصورة المرفقة
13592
kira-h
09-05-2019, 05:15 AM
السلام عليكم استاذي
ممكن تساعدني في تعديل الاكسبيرت تبعي علما بانك صاحب الفضل الكبير في تعليمي للبرمجة
اريد وضع كود مضاعافات له
ثانيا
اريد خاصية تعديل الهدف لتلائم عدد الصفقات
مرفق الاكسبيرت
وعليكم السلام
الحمد لله
أخي الكريم المرجو التوضيح لطريقة تعديل الهدف بالارقام او من الشارت او بصورة تخطيطية....
مرفق الاكسبيرت به المضاعفات
mr.forex
09-05-2019, 06:41 AM
نعم، ولا يمكن ان يضع البروكر الهدف والوقف دون أمر منك !
أقل عدد النقاط المسموح به يختلف من بروكر لآخر، ويمكن معرفته من نافذة تنفيذ الأوامر كما بالصورة المرفقة
13592
شكرا أستاذ الأمور تمام
دعواتي لك ربي ييسر لك أمورك ويكتب لك التوفيق والنجاح
mahmoud1111
09-05-2019, 05:42 PM
الف شكر لك استاذي
اول شي الاكسبيرت لا يفتح علي المنصة الان دون وجود اي خطا
ثاني شي المقصود بتعديل الهدف يعني ان لو الاكسبيرت فتح صفقة ثم عكست سوف يفتح صفقة تبريد لها اريد الصفقتين ان يكون لهم نفس الهدف
شكر كبير لك استاذي وكل عام وانتم بخير
sabil
12-05-2019, 10:40 AM
سلام عليكم اخي حسن
كل عام وحضرتك بخير
اريد دالة استخراج قيمة الهاي واللو لشمعة الربع ساعة التي تحتوي على اعلى فوليوم لليوم السابق
kira-h
12-05-2019, 07:28 PM
شكرا أستاذ الأمور تمام
دعواتي لك ربي ييسر لك أمورك ويكتب لك التوفيق والنجاح
وإياك أخي الكريم
mahmoud1111
13-05-2019, 09:38 AM
السلام عليكم ورحمة الله وبركاته
استاذي اتمني ان لا تنسانا
يرجي مراجعة المنشور قبل هذا
اعلم انك مشغول ولكن ...... كل عام وانتم بخير
الاكسبيرت الان لا يفتح علي المنصة
يرجي مراجعة المنشور قبل هذا
اعلم انك مشغول
ولكننا بد
Ahmed
13-05-2019, 11:24 AM
السلام عليكم اخي حسن وكل عام وانتم بخير
اريد مثال لطريقة برمجة اكسبيرت دايفرجنس لمؤشر الماجد
بارك الله فية وجزاك الله خيرا
Ahmed
13-05-2019, 06:00 PM
على سبيل المثال هذ المؤشر اخي حسن
هو يعطي سهم على الشارت عند حدوث دايفرجنس
لكن لم اجد له نفس اللون في الانديكس
فكيف اجعل الاكسبيرت يقوم بالبيع والشراء بناء على السهم الذي يظهر على الشارت عند حدوث الدايفرجنس
13672
kira-h
15-05-2019, 01:41 AM
على سبيل المثال هذ المؤشر اخي حسن
هو يعطي سهم على الشارت عند حدوث دايفرجنس
لكن لم اجد له نفس اللون في الانديكس
فكيف اجعل الاكسبيرت يقوم بالبيع والشراء بناء على السهم الذي يظهر على الشارت عند حدوث الدايفرجنس
13672
الاسهم بهذا المؤشر عبارة عن اوبجكت وليس اندكس
وبالتالي لمعرفة قيمة السهم ستستخدم الوظيفة ObjectGet
مثال حسب المؤشر :
datetime up=ObjectGet("i-AO-Div3_chart_la1_"+Time[1],OBJPROP_TIME1),//توقيت السهم الأزرق عند الشمعة1
dn=ObjectGet("i-AO-Div3_chart_ua1_"+Time[1],OBJPROP_TIME1);//توقيت السهم الأصفر عند الشمعة1
if(up==Time[1])//buy
if(dn==Time[1])//sell
kira-h
15-05-2019, 01:50 AM
السلام عليكم ورحمة الله وبركاته
استاذي اتمني ان لا تنسانا
يرجي مراجعة المنشور قبل هذا
اعلم انك مشغول ولكن ...... كل عام وانتم بخير
الاكسبيرت الان لا يفتح علي المنصة
يرجي مراجعة المنشور قبل هذا
اعلم انك مشغول
ولكننا بد
وعليكم السلام
راجع مشاركتي السابقة #2227 (https://www.fxprg.com/vb/showthread.php?t=31457&p=897244&viewfull=1#post897244)
تحياتي
Ahmed
15-05-2019, 02:53 PM
الاسهم بهذا المؤشر عبارة عن اوبجكت وليس اندكس
وبالتالي لمعرفة قيمة السهم ستستخدم الوظيفة ObjectGet
مثال حسب المؤشر :
datetime up=ObjectGet("i-AO-Div3_chart_la1_"+Time[1],OBJPROP_TIME1),//توقيت السهم الأزرق عند الشمعة1
dn=ObjectGet("i-AO-Div3_chart_ua1_"+Time[1],OBJPROP_TIME1);//توقيت السهم الأصفر عند الشمعة1
if(up==Time[1])//buy
if(dn==Time[1])//sell
بارك الله فيك اخي حسن
mahmoud1111
15-05-2019, 06:28 PM
صحيح ولكنه يظهر خطا في التيست
ولا يعمل المضاعفات
ممكن ان تجرب ذلك استاذي
kira-h
16-05-2019, 05:40 AM
صحيح ولكنه يظهر خطا في التيست
ولا يعمل المضاعفات
ممكن ان تجرب ذلك استاذي
كود المضاعفات سليم لكن ربما لا يفتح صفقاته بسبب الشروط لا تتحقق، لهذا راجعها بشكل منطقي
أو اشرح الفكرة كاملة لأفهم ما تريده من الاكسبيرت
kira-h
16-05-2019, 05:42 AM
بارك الله فيك اخي حسن
وإياك أخي الكريم
mahmoud1111
16-05-2019, 09:36 AM
كود المضاعفات سليم لكن ربما لا يفتح صفقاته بسبب الشروط لا تتحقق، لهذا راجعها بشكل منطقي
أو اشرح الفكرة كاملة لأفهم ما تريده من الاكسبيرت
الشروط سهلة كالتالي
أولا يفتح صفقة حسب الشرط بيع أو شراء
ثانيا. إذا عكست الصفقة مثلا 10 نقاط يفتح صفقة تبريد بلوت مضاعف مع توحيد الهدف
وهكذا حتي إغلاق كل الصفقات تغلق على ربح
kira-h
16-05-2019, 06:18 PM
الشروط سهلة كالتالي
أولا يفتح صفقة حسب الشرط بيع أو شراء
ثانيا. إذا عكست الصفقة مثلا 10 نقاط يفتح صفقة تبريد بلوت مضاعف مع توحيد الهدف
وهكذا حتي إغلاق كل الصفقات تغلق على ربح
توحيد الهدف أين ؟ يمكنك التوضيح بصورة تخطيطية أو من الشارت
mahmoud1111
16-05-2019, 08:54 PM
توحيد الهدف أين ؟ يمكنك التوضيح بصورة تخطيطية أو من الشارت
أستاذي الحبيب
توحيد الهدف معناه جميع الصفقات العاكسة لنفس الصفقة تيك بروفت واحد
يعني
حين تضرب الصفقة الهدف يغلق معها كل الصفقات التي كانت عاكسة مرة واحدة
اتمني ان تكون الفكرة وصلت أستاذي الحبيب
Abdullah Mohammed
17-05-2019, 11:43 PM
السلام عليكم ورحمة الله
كيف سيكون الكود البرمجي
لفكرة هذا الموشر
هي حساب اربعة انواع من الترندات في داخل جسم الشمعة سواء كانت شمعه يوميه او غيرها من الشموع ولا بد ان لايقل مقدار الترند عن 20 نقطة سواء صعودا اوهبوطا وتكون البدايه مع سعر افتتاح الشمعة
1. الترند الطالع : هو كل ترند موجود دائما فوق سعر الافتتاح من قبل ان يرتد السعر ويتكون الترند المرتد
2.الترند النازل : هو كل ترند موجود دائما تحت سعر الافتتاح من قبل ان يرتد السعر ويتكون الترند المرتد
3.الترند المرتد : هو كل ترند موجود اما فوق او تحت سعر الافتتاح وهو يتكون دائما بعد كل ترند طالع او نازل.
4.الترند القاطع: هو كل ترند موجود جزء منه فوق سعر الافتتاح والجزء الاخر تحت سعر الافتتاح اي انه بتقاطع مع سعر الافتتاح
كما قلت سابقا لابد ان يكون الترند عبارة عن 20 نقطه او أكثر حتى نعتبره ترند
مثال على فكرة المؤشر حتى تتضح الفكرة اكثر
لوافترضنا ان سعر افتتاح الشمعه اليوميه كان 1400 وبعد ها ارتفع السعر الى الاعلى حتى نقطه 1460 يقوم المؤشر باحتساب هذا على انه ترند من نوع طالع ويسميه ترند رقم 1 ومقداره 60 نقطه
ولو افترضنا انه بعد ذلك انعكس السعر وصار عند 1435 نقطه يقوم الموشر باحتسابه على انه ترند من نوع مرتد ويسميه ايضا رقم 1 ومقداره 25 نقطه ولو واصل الارتفاع مرة اخرى الى 1470
يصير ترند من نوع طالع ويعطيه الرقم 2 بمقدار 35 نقطه ومن ثم هبط السعر الى 1390 يصير ترند من نوع قاطع لانه قطع سعر الافتتاح ويعطيه الرقم 1 ومقداره 80 نقطه .
و هكذا تتم العمليه الى نهاية الشمعة.. وبعدها يقوم بجمع عدد الترندات لكل نوع وكذلك المجموع الكلي لمقاديرها.
ان شاء الله تكون الفكره وصلت.... مشكور مقدما اخي
kira-h
18-05-2019, 03:44 AM
السلام عليكم ورحمة الله
كيف سيكون الكود البرمجي
لفكرة هذا الموشر
هي حساب اربعة انواع من الترندات في داخل جسم الشمعة سواء كانت شمعه يوميه او غيرها من الشموع ولا بد ان لايقل مقدار الترند عن 20 نقطة سواء صعودا اوهبوطا وتكون البدايه مع سعر افتتاح الشمعة
1. الترند الطالع : هو كل ترند موجود دائما فوق سعر الافتتاح من قبل ان يرتد السعر ويتكون الترند المرتد
2.الترند النازل : هو كل ترند موجود دائما تحت سعر الافتتاح من قبل ان يرتد السعر ويتكون الترند المرتد
3.الترند المرتد : هو كل ترند موجود اما فوق او تحت سعر الافتتاح وهو يتكون دائما بعد كل ترند طالع او نازل.
4.الترند القاطع: هو كل ترند موجود جزء منه فوق سعر الافتتاح والجزء الاخر تحت سعر الافتتاح اي انه بتقاطع مع سعر الافتتاح
كما قلت سابقا لابد ان يكون الترند عبارة عن 20 نقطه او أكثر حتى نعتبره ترند
مثال على فكرة المؤشر حتى تتضح الفكرة اكثر
لوافترضنا ان سعر افتتاح الشمعه اليوميه كان 1400 وبعد ها ارتفع السعر الى الاعلى حتى نقطه 1460 يقوم المؤشر باحتساب هذا على انه ترند من نوع طالع ويسميه ترند رقم 1 ومقداره 60 نقطه
ولو افترضنا انه بعد ذلك انعكس السعر وصار عند 1435 نقطه يقوم الموشر باحتسابه على انه ترند من نوع مرتد ويسميه ايضا رقم 1 ومقداره 25 نقطه ولو واصل الارتفاع مرة اخرى الى 1470
يصير ترند من نوع طالع ويعطيه الرقم 2 بمقدار 35 نقطه ومن ثم هبط السعر الى 1390 يصير ترند من نوع قاطع لانه قطع سعر الافتتاح ويعطيه الرقم 1 ومقداره 80 نقطه .
و هكذا تتم العمليه الى نهاية الشمعة.. وبعدها يقوم بجمع عدد الترندات لكل نوع وكذلك المجموع الكلي لمقاديرها.
ان شاء الله تكون الفكره وصلت.... مشكور مقدما اخي
وعليكم السلام
لا يمكن معرفة حركة السعر في شمعة سابقة (بداية من آخر شمعة مغلقة)
اما الشمعة الحالية ممكن بعمليات المقارنة كما قمت بها ثم تحفظ القيم من نوع static وتقارنها مع القيم الجديدة ...
kira-h
18-05-2019, 04:24 AM
أستاذي الحبيب
توحيد الهدف معناه جميع الصفقات العاكسة لنفس الصفقة تيك بروفت واحد
يعني
حين تضرب الصفقة الهدف يغلق معها كل الصفقات التي كانت عاكسة مرة واحدة
اتمني ان تكون الفكرة وصلت أستاذي الحبيب
مرفق الاكسبيرت
Abdullah Mohammed
18-05-2019, 10:32 AM
وعليكم السلام
لا يمكن معرفة حركة السعر في شمعة سابقة (بداية من آخر شمعة مغلقة)
اما الشمعة الحالية ممكن بعمليات المقارنة كما قمت بها ثم تحفظ القيم من نوع static وتقارنها مع القيم الجديدة ...
حياك الله اخي كيرا
اتوقع الفكره لم تصلك بشكل المطلوب وكما يقولون الصوره خير من الف كلمة
هننا صورة للفكره واتوقع الفكرة شبيهه بفكرة موشر الزجزاج
13797
mahmoud1111
18-05-2019, 02:41 PM
مرفق الاكسبيرت
الف شكر أستاذي الكريم
وكل عام وانتم بخير
وجاري التجريب
kira-h
18-05-2019, 11:32 PM
حياك الله اخي كيرا
اتوقع الفكره لم تصلك بشكل المطلوب وكما يقولون الصوره خير من الف كلمة
هننا صورة للفكره واتوقع الفكرة شبيهه بفكرة موشر الزجزاج
13797
حسب مثالك بالصورة هل الحركة بنفس الشمعة يعني من الافتتاح الى الاغلاق؟ اذا كان جوابك نعم ففهمي صحيح، وراجع الرد السابق
واذا كان لا فالمرجو التوضيح بصورة من الشارت
وارفق الكود الذي قمت بعمله للتصحيح فهذا الموضوع ليس للطلبات بل للاسئلة البرمجية وتصحيح الاخطاء وتبادل الخبرات...
Abdullah Mohammed
19-05-2019, 01:16 AM
حسب مثالك بالصورة هل الحركة بنفس الشمعة يعني من الافتتاح الى الاغلاق؟ اذا كان جوابك نعم ففهمي صحيح، وراجع الرد السابق
واذا كان لا فالمرجو التوضيح بصورة من الشارت
وارفق الكود الذي قمت بعمله للتصحيح فهذا الموضوع ليس للطلبات بل للاسئلة البرمجية وتصحيح الاخطاء وتبادل الخبرات...
حياك الله استاذي العزيز
اخوك جديد هنا وفي هذا المحيط وما عندي خبرة في البرمجة اعتبر اسئلتي لتعلم من تلميذ لمعلمه ...ومنكم نتعلم
صراحة قرات ردك اكثر من مرة ولم افهم ماتقصدة بالضبط
هل تقصد انك تستطيع تنفيذ الفكرة اذا كانت لمجموعه الشموع التي تكون قد تكونت وانتهت ولديك فكره عن حركه السعر بداخلها ام تقصد العكس
فكرتي اتوقع قريبة جدا من فكرة الزجزاج... كيف يعرف موشر الزجزاج الترندات الصاعده والهابطة في مجموعه من الشموع السابقة..
كيف ستكون الترجمه لهذا الشرط مثلا
اذا كان الفرق بين السعر الحالي للشمعة واعلى نقطه وصل اليها السعر هو عشرين نقطه فاكثر اذا قيمة اعلى نقطه ناقص سعر الافتتاح هو الترند الصاعد الاول
اي بمعني
اذا كان السعر الحالي للشمعة مبتعدا عن اعلى نقطه بمقدار عشرين نقطه فان اعلى نقطه ناقص سعر الافتتاح هو الترند الصاعد
المشكله اني لم استطيع كتابة هذه الشروط على ارض الواقع ...ومنكم نتعلم