شكرا اخي مستر دولار على المعلومات
هل يوجد موقع معين خاص بال MQL حيث يقدم كل الكلمات الدلالية للغة وشرحها (مثل OrderSend,,,SELECT_BY_POS,,,REASON_CHARTCLOSE
وغيرها .ويكون ايضا موقع تعليمي جيد للغة(غير موقع mql4.com).
شكرا جزيلا
Printable View
شكرا اخي مستر دولار على المعلومات
هل يوجد موقع معين خاص بال MQL حيث يقدم كل الكلمات الدلالية للغة وشرحها (مثل OrderSend,,,SELECT_BY_POS,,,REASON_CHARTCLOSE
وغيرها .ويكون ايضا موقع تعليمي جيد للغة(غير موقع mql4.com).
شكرا جزيلا
السلام عليكم
الاخ ميستر دولار
في هذا الموضوع قمت ببرمجة اكسبيرت يعمل بمضاعفة فيبوناتشي
https://forum.arabictrader.com/t111353.html
و في محاولة مني لفهم طريقة عمل الاكسبيرت، اذا سمحت أريد أن أطرح بعض الاسئلة
أولا لقد قمت بتقسيم الكود للمراحل التالية
1/التصريح بالمتغيرات
2/التعامل مع عدد الارقام بعد الفاصلة
3/ حساب عدد الاوامر المفتوحة
4/التحقق من شرط الدخول و الدخول بمضاعفة
5/التحقق من وقت التداول
6/الدخول بالعقد الاول بعد التأكد من شروط الدخول
حسنا
لماذا وضعت كود الدخول بمضاغعفة قبل كود الصفقة الاولى و هل اذا بدلنا بينهما سيأثر ذلك على عمل الاكسبيرت
ما دور الدالة movebreakeven()
ما هي الدالة PL()وما هو دورها.
كيف يكمنني عمل مضاعفات على الشكل 1-1-1-1 ثم 2-2-2 ثم 4-4-4. هدفي هو تعلم التحكم في عدد العقود بصفة عامة.
أخيرا هل يكمن عمل اكسبيرت نصف آلي مثلا أنا أقوم بفتح العقود يدويا و هو يكمل الباقي.
أرجوا أن لا أكون أثقلت عليك
شكرا مسبقا
تحياتي الخالصة
طرق برمجة الإكسبرتات مهما كانت قد تختلف من مبرمج لآخر وأيضا ربما نفس المبرمج لكن يقوم ببرمجة الإكسبرت بأكثر من طريقة
فلو راجعت أحد الإكسبرتات الأخرى التي قمت ببرمجتها سوف تجد أنني إستخدمت المضاعفات بطرق أخرى مختلفه
بالنسبه لهذا الإكسبرت
فسر المضاعفات هنا هو الداله التي قمت بعملها والتي سألت أيضا أنت عنها
هذه الداله تقوم بالبحث في الصفقات التي أغلقت لمعرفة هل آخر صفقة حققت الهدف أم لا فإذا كانت قد أغلقت على ربح تعود بالقيمه ترو وإذا أغلقت على خساره تعود بالقيمه فولسكود PHP:bool LP(){
for(int i=OrdersHistoryTotal();i>0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
if(OrderProfit()>=0)return(true);
else return(false);
}
}
return(true);
}
وبما أنني وضعت هذا الشرط من ضمن شروط الدخول في المضاعفات
بالتالي فلن يختلف إذا وضعت كود الصفقه الأولى قبل المضاعفات أو بعدها فلن يفرق لأن كلا الحالتين مقيده بشروط فتح الصفقهكود PHP:if(!LP())
وظيفة الداله MoveBreakEven
فلو راجعت الكود الخاص بتعريف هذه الداله
فإذا حققت الصفقه ربح عدد نقاط أكبر من المتغير BreakEven والذي يتم تحديده في متغيرات الإكسبرتكود PHP:void MoveBreakEven()
{
int cnt,total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
if(BreakEven>0)
{
if(NormalizeDouble((Bid-OrderOpenPrice()),digits)>BreakEven*point)
{
if(NormalizeDouble((OrderStopLoss()-OrderOpenPrice()),digits)<0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+movestopto*point,digits),OrderTakeProfit(),0,Blue);
return(0);
}
}
}
}
else
{
if(BreakEven>0)
{
if(NormalizeDouble((OrderOpenPrice()-Ask),digits)>BreakEven*point)
{
if(NormalizeDouble((OrderOpenPrice()-OrderStopLoss()),digits)<0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-movestopto*point,digits),OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
}
يقوم الإكسبرت بعمل مودفاي للأمر وينقل الأستوب لوز إلى نقطة الدخول أو إلى ربح عدد نقاط
الذي يتم تحديده في المتغير movestopto
يمكنك التحكم في طريقة المضاعفات التي تريدها لكن المهم أن تقوم بتحويل هذه الفكره إلى طريقة رياضيه يمكن برمجتها
فمثلا لنفرض أنك تريد فتح مضاعفات بالشكل الآتي 1 1 1 2 2 2 3 3 3
بالتالي ماذا سوف نحتاج ؟
ستحتاج إلى عمل داله لمعرفة آخر حجم لوت للصفقه الأخيره
سنحتاج إلى معرفة كم عدد الصفقات التي أغلقت على نفس حجم اللوت وتساوي حجم اللوت الأخيركود PHP:double LastLot()
{
int d;
for(int i=OrdersHistoryTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
double L=OrderLots();
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
return(L);
}
}
}
بالتالي في شروط المضاعفه سوف تضع الشرط الآتيكود PHP:int LotsNumber(){
int N;
for(int i=OrdersHistoryTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
double L=OrderLots();
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
if(L==LastLot())N++;
if(L!=LastLot())return(N);
}
}
return(N);
}
وهذا يعني إذا كان حجم اللوت لآخر ثلاث صفقات متساوي أي مثلا 2 2 2كود PHP:if(LotsNumber()==3)
{
NewLot=LastLot()+FirstLot;
}
else {
NewLot=LastLot();
}
فإن حجم اللوت التالي سوف يساوي حجم آخر لوت وهو 2 + حجم اللوت الإبتدائي ولنفرض أنه 1
فيكون حجم اللوت التالي هو 3
وهكذا يستمر الحسب
اخي العزيز اسامه
هل ممكن تطلع على الموضوع https://forum.arabictrader.com/f31.html حيث والشباب هناك بنتضارك واعتذر على الازعاج.
والله الموفق
السلام عليكم ورحمة الله وبركاته
أخي العزيز لدي سؤال محير
لمذا لا يظهر المؤشر في الشموع القادمة قبل بدايتها (-1/-2/-3....)؟؟
وجزاك الله خيراً
والسلام عليكم ورحمة الله وبركاته
لقد اتبعت الخطوات الموجودة في التطبيق العملي لبرمجة اكسبيرت في هذا الموضوع
https://forum.arabictrader.com/t97945.html
بعد أن وصلت الى مرحلة اضافة الدالة التي تقوم بحساب العدد الكلي لصفقات و اضافتها كشرط لفتح صفقة جديدة ، قمت بعمل تست،فحدث الخطأ التالي :
ordersend error 148
كود://+------------------------------------------------------------------+
//| sar-expert.mq4 |
//| Copyright © 2011, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern int price=0;
extern int period=20;
extern int takeprofit=50;
extern int stoploss=25;
extern int slippage=3;
extern double lots=0.1;
int ticket, tp,sl,magicnumber,i;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double rsi_1=iRSI(NULL,0,period,price,0);
double rsi_2=iRSI(NULL,0,period,price,1);
//***فتح صفقة بيع
if(all_orders()<1 && rsi_2>70 && rsi_1<70)
{
if(stoploss==0){sl=0;}else {sl=Bid+stoploss*Point;}//**وقف الخسارة
if(takeprofit==0){tp=0;} else {tp=Bid-takeprofit*Point;}//** الربح
}
ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,sl,tp,"rsi EA sell",magicnumber,0,Red);
if (ticket<1)
{
Print("you can not sell, the error number is",GetLastError());
}
//**فتح صفقة الشراء
if(all_orders()<1 && rsi_2<30 && rsi_1>30)
{
if(stoploss==0){sl=0;} else{sl=Ask-stoploss*Point;}
if(takeprofit==0){tp=0;}else{tp=Ask+takeprofit*Point;}
}
ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,sl,tp,"rsi EA buy",magicnumber,0,Green);
if(ticket<1)
{
Print("you can not buy, the error number is", GetLastError());
}
//----
return(0);
}
//+------------------------------------------------------------------+
int all_orders()
{
int cnt=0;
for(i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magicnumber)
cnt++;
}
return(cnt);
}
جاري مراجعة الموضوع
وعليكم السلام ورحمة الله وبركاته
لا يمكنك عمل مصفوفه بهذا الشكل مثلا
لأن المصفوفات تأخذ القيم من 0 إلى حجم المصفوفه -1كود PHP:ExtMapBuffer1[-3]=High[1];
لكن يمكنك إستخدام الأمر
لتحريك المصفوفه للأمام أو للخلف عدد الشموع الذي تريدهكود PHP:SetIndexShift
الخطأ 148 يعني أن عدد الصفقات المفتوحه في نفس الوقت وصل إلى الحد الأقصى الذي يسمح به البروكر
الخطأ لديك في هذا الجزء
لاحظ أنك قمت بإغلاق القوس { قبل أمر فتح الصفقه بالتالي فكأنك لم تضع أي شرط لفتح الصفقهكود PHP:if(all_orders()<1 && rsi_2>70 && rsi_1<70)
{
if(stoploss==0){sl=0;}else {sl=Bid+stoploss*Point;}//**وقف الخسارة
if(takeprofit==0){tp=0;} else {tp=Bid-takeprofit*Point;}//** الربح
/////////// }
ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,sl,tp,"rsi EA sell",magicnumber,0,Red);
if (ticket<1)
{
Print("you can not sell, the error number is",GetLastError());
}
}//////////////
فيجب أن تقوم بإغلاق القوس بعد أمر OrderSend
قمت بوضع لك علامة ///////////// بجوار القوس الصحيح وأين يجب وضعه
شكرا أخي Mr.Dollar
لكن بعد التصحيح ، يظهر الخطأ 130
وعليكم السلام ورحمة الله وبركاته
سوف تقوم بتعريف متغير خارجي تحدد فيه التاريخ مثلا
ثم بإستخدام نفس الداله iBarShift سوف تقوم بمعرفة رقم هذه الشمعه التي لها نفس التوقيتكود PHP:extern datetime day=D'2010.10.10 12:00';
ثم تكمل برمجة المؤشر ببساطهكود PHP:int Shift=iBarShift(Symbol(),0,day,false);
كود PHP:for(int i=shift;i>0;i--)
{
// do
}
الاخ العزيز اسامه
هل بالامكان اضافة خاصية اغلاق للاكسبيرت المرفق عندما يصل الاكويتي الى قيمة معينه.
واذا كال لك فكرة عن هذا الاكسبيرت وشرح عن عمله اكون شاكرا" لك.
والله الموفق