النتائج 1 إلى 15 من 15
الموضوع: سؤال سريع للاخوة المبرمجين
- 16-09-2017, 12:15 AM #1
سؤال سريع للاخوة المبرمجين
مساء الخير اخوتي
انا جديد في المنتدى واتشرف بالتواصل مع الاخوة المشرفين والمشاركين
سؤال بسيط للاخوة المختصين بالبرمجة
انا احاول تعلم البرمجة وصنعت اكسبرت بسيط لكن الغريب ان الاكسبرت لا يفتح صفقات رغم انه لا يعطي اخطاء
الاكسبرت في المرفق اتمنى المساعدة من الاساتذة ذوي الخبرة
- 16-09-2017, 04:04 AM #2
فكرة الاكسبرت هو شراء وبيع مع تقاطع الموفينك 8 مع الباربوليك سار
- 16-09-2017, 04:38 AM #3
انت كتبت سكربت وليس اكسبيرت
كود PHP:int init()
int start()
استخدم OnTimer
او OnTick
- 16-09-2017, 11:18 AM #4
وعليكم السلام
الكود الذي كتبته هو مؤشر وليس اكسبرت وذلك لوجود هذا الكود بالاعلى
كود:#property indicator_chart_window
- 16-09-2017, 03:29 PM #5
انا اخترت اكسبرت ادفايزر في بداية الانشاء
- 16-09-2017, 03:35 PM #6
اجريت بعض التعديلات على الكود الان يفتح لكن بشكل عشوائي وعند وضع الكود داخل OnTick او OnTimer لا يفتح ابد
- 16-09-2017, 03:39 PM #7
عملت بعض التحسينات والان يفتح ويغلق صفقات بشكل عشوائي ومتراكم ارجوا المساعدة اخوتي
الكود الاخير بالمرفق
- 16-09-2017, 04:38 PM #8
[ATTACH=CONFIG]472427[/ATTACH
يفتح صفقات عشوائية ومتراكمة كما في الصورة
- 17-09-2017, 11:11 AM #9
بعد أن نزعت الكود التالي كما رأيت بدأ يفتح صفقات لأن الكود التالي يعني انك عرفت البرنامج كمؤشر وعلى الشارت الرئيسي .
كود:#property indicator_chart_window
أنك كتبت شرط فتح الصفقة بداخل الدالة التالية start ولم تحدد عدد الصفقات المطلوب فتحها.
والاكسبرت بهذه الحالة سيقرأ شرط فتح الصفقة بكل وقت يتحرك السعر ويفتح صفقات الى مالانهاية .
كود:int start() {}
والكود التالي هي داله تعد لك عدد الصفقات المفتوحة فلو كتبتها عند استدعائها
كود:count(1)
ولو كتبتها
كود:count(2)
والدالة هي:
كود:int count(int t){ int T=0; for (int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if (OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber) { if(OrderType() == OP_BUY&&t==1)T++; if(OrderType() == OP_SELL&&t==2)T++; } } } return(T); }
وهذا الاكسبرت بعد اضافتها .آخر تعديل بواسطة tradingsystem ، 17-09-2017 الساعة 11:15 AM
- 17-09-2017, 11:33 AM #10
واذا اردت ان يفتح صفقة واحدة فقط بيع او شراء وليس بيع وشراء معاً ستعدله هكذا
كود:int start()
{ //---- if(count(1)==0&&count(2)==0){ if(sar1 > ma1 && sar2 < ma2) if(OrdersTotal()==0) if (StopLossPips ==0)buySL =0 ; else buySL =Ask - (TakeProfitPips*t); if(TakeProfitPips==0)buyTP=0; else buyTP = Ask +(TakeProfitPips*t); bool x = OrderSend (Symbol(),OP_BUY,LotSize,Ask,5,Ask - (StopLossPips*t),Ask + (TakeProfitPips*t),NULL,MagicNumber,0,Green); } if(count(2)==0&&count(1)==0){ if(sar1 < ma1 && sar2 > ma2) if(OrdersTotal()==0) if(StopLossPips ==0)selSl=0; else selSl= Bid+(StopLossPips*t); if(TakeProfitPips==0)selTP=0; else selTP=Bid -(TakeProfitPips*t); bool xx = OrderSend (Symbol(),OP_SELL,LotSize,Bid,5, Bid+ (StopLossPips*t),Bid -(TakeProfitPips*t),NULL,MagicNumber,0,Red); } if (breakEven > 0)breakeven(); //---- return(0); }
- 17-09-2017, 02:38 PM #11
شكراً استاذ على الرد والمساعدة القيمة
انحل مشكلة الصفقات المتراكمة لكن الان يفتح صفقات شراء فقط وبدون العودة الى السار والموفينك كما موضح في الصورة من ماذا تعتقد يكون الخلل؟؟
والمشكلة الثانية انهو اول ميغلق الصفقة يفتح صفقة ثانية مباشرة يعني ما يلتفت الى المعادلة اللي كتبناها if(sar1 < ma1 && sar2 > ma2)
ارجوا منكم سعة الصدر انا قديم في التداول لكن احاول فهم البرمجة لان وقتي اصبح ضيق واحتاج الى تصميم اكسبرت ليتداول عني في غالب الوقت
- 18-09-2017, 01:11 AM #12
سأعلق على الاكسبرت بالجزء.
كود://+------------------------------------------------------------------+ //| Byu_Sell_Day.mq4 | //| Copyright © 2007, www.****forex.net | //| http://www.****forex.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, www.****forex.net" #property link "http://www.****forex.net" extern double LotSize=0.1; extern double StopLossPips=60; extern double TakeProfitPips=60; extern int MagicNumber = 55558; extern int breakEven = 20 ; extern int matimeframe = 240; extern int maperiod = 8; extern int mashift = 0; extern int mamethod = 0; extern int maappliedprice=0; extern int smatimeframe = 240; extern int smaperiod = 14; extern int smashift = 0; extern int smamethod = 0; extern int smaappliedprice=0; extern int sartimeframe=240; extern double sarstep=0.02; extern double sarmaximum=0.2; extern int sarshift=0; double t; double buySL,buyTP,selSl,selTP; double ma1 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,1); double ma2 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,2); double sma1 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,1); double sma2 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,2); double sar1 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,1); double sar2 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,2); //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- double tik=MarketInfo(Symbol(),MODE_TICKSIZE); if(tik==0.00001 || 0.0001) t=tik*10; else t=tik; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if(count(1)==0&&count(2)==0){ if(sar1 > ma1 && sar2 < ma2) if(OrdersTotal()==0) if (StopLossPips ==0)buySL =0 ; else buySL =Ask - (TakeProfitPips*t); if(TakeProfitPips==0)buyTP=0; else buyTP = Ask +(TakeProfitPips*t); bool x = OrderSend (Symbol(),OP_BUY,LotSize,Ask,5,Ask - (StopLossPips*t),Ask + (TakeProfitPips*t),NULL,MagicNumber,0,Green); } if(count(2)==0&&count(1)==0){ if(sar1 < ma1 && sar2 > ma2) if(OrdersTotal()==0) if(StopLossPips ==0)selSl=0; else selSl= Bid+(StopLossPips*t); if(TakeProfitPips==0)selTP=0; else selTP=Bid -(TakeProfitPips*t); bool xx = OrderSend (Symbol(),OP_SELL,LotSize,Bid,5, Bid+ (StopLossPips*t),Bid -(TakeProfitPips*t),NULL,MagicNumber,0,Red); } if (breakEven > 0)breakeven(); //---- return(0); } //+------------------------------------------------------------------+ void breakeven () { for (int i= OrdersTotal ()-1; i >=0;i--) { if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) if (OrderSymbol() == Symbol ()) if (OrderMagicNumber() == MagicNumber ) if (OrderType() == OP_BUY) if (Bid - OrderOpenPrice ()> breakEven*t ) if (OrderOpenPrice() > OrderStopLoss ()) bool xx= OrderModify (OrderTicket(),OrderOpenPrice (),OrderOpenPrice (),OrderTakeProfit(),0,Pink); } for (int ii= OrdersTotal()-1; ii >=0;ii--) { if (OrderSelect (ii,SELECT_BY_POS,MODE_TRADES)) if (OrderSymbol() == Symbol ()) if (OrderMagicNumber() == MagicNumber ) if (OrderType() == OP_SELL) if (OrderOpenPrice() - Ask > breakEven*t ) if (OrderOpenPrice() < OrderStopLoss ()) bool x= OrderModify (OrderTicket(),OrderOpenPrice (),OrderOpenPrice (),OrderTakeProfit(),0,Pink); } } int count(int t){ int T=0; for (int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if (OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber) { if(OrderType() == OP_BUY&&t==1)T++; if(OrderType() == OP_SELL&&t==2)T++; } } } return(T); }
وبالاعدادات كتبت extern int matimeframe = 240 يعني اعمل على شارت اربع ساعات وتستطيع التعديل على الشارت من الاعدادات.
كود:double ma1 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,1); double ma2 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,2); double sma1 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,1); double sma2 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,2); double sar1 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,1); double sar2 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,2);
لا طبعاً ، لأنك وضعته بالبداية وليس بالدالة ()Start.
وهذا يعني أنك ستأخذ قيم المؤشرات عند بداية وضع الاكسبرت على الشارت فقط وستظل تطبق الشروط على تلك القيم طوال فترة عمل الاكسبرت والحل هو نزع الاكواد من ذلك المكان ووضعها بداخل الدالة ()Start .
واظن أنك تقصد بالكود التالي بأنك تريد تعدل الهدف ووقف الخسارة الموجود بالاعدادات لكي يعمل على الشركات ذات الخمس نقاط مثل الاسعار 1.23235 و 110.230.
وأنت كتبت
كود:double t; int init() { //---- double tik=MarketInfo(Symbol(),MODE_TICKSIZE); if(tik==0.00001 || 0.0001) t=tik*10; else t=tik; //---- return(0); }
كود:double t; int init() { //---- double tik=MarketInfo(Symbol(),MODE_TICKSIZE); if(tik==0.00001 || tik==0.001) t=tik*10; else t=tik; //---- return(0); }
وكتبت الكود التالي
كود:if(sar1 > ma1 && sar2 < ma2) if(OrdersTotal()==0) if (StopLossPips ==0)buySL =0 ; else buySL =Ask - (TakeProfitPips*t); if(TakeProfitPips==0)buyTP=0; else buyTP = Ask +(TakeProfitPips*t); bool x = OrderSend (Symbol(),OP_BUY,LotSize,Ask,5,Ask - (StopLossPips*t),Ask + (TakeProfitPips*t),NULL,MagicNumber,0,Green); if(sar1 < ma1 && sar2 > ma2) if(OrdersTotal()==0) if(StopLossPips ==0)selSl=0; else selSl= Bid+(StopLossPips*t); if(TakeProfitPips==0)selTP=0; else selTP=Bid -(TakeProfitPips*t); bool xx = OrderSend (Symbol(),OP_SELL,LotSize,Bid,5, Bid+ (StopLossPips*t),Bid -(TakeProfitPips*t),NULL,MagicNumber,0,Red);
كود:if(count(1)==0&&count(2)==0){ if(sar1 < ma1 && sar2 > ma2) { bool x = OrderSend (Symbol(),OP_BUY,LotSize,Ask,5,Ask - (StopLossPips*t),Ask + (TakeProfitPips*t),NULL,MagicNumber,0,Green); } } if(count(2)==0&&count(1)==0){ if(sar1 > ma1 && sar2 < ma2){ bool xx = OrderSend (Symbol(),OP_SELL,LotSize,Bid,5, Bid+ (StopLossPips*t),Bid -(TakeProfitPips*t),NULL,MagicNumber,0,Red); } }
كود://+------------------------------------------------------------------+ //| Byu_Sell_Day.mq4 | //| Copyright © 2007, www.****forex.net | //| http://www.****forex.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, www.****forex.net" #property link "http://www.****forex.net" extern double LotSize=0.01; extern double StopLossPips=30; extern double TakeProfitPips=30; extern int MagicNumber = 55558; extern int breakEven = 20 ; extern int matimeframe = 240; extern int maperiod = 8; extern int mashift = 0; extern int mamethod = 0; extern int maappliedprice=0; extern int smatimeframe = 240; extern int smaperiod = 14; extern int smashift = 0; extern int smamethod = 0; extern int smaappliedprice=0; extern int sartimeframe=240; extern double sarstep=0.02; extern double sarmaximum=0.2; extern int sarshift=0; double t=1; double buySL,buyTP,selSl,selTP; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- double tik=MarketInfo(Symbol(),MODE_TICKSIZE); if(tik==0.00001 || tik==0.001) t=tik*10; else t=tik; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double ma1 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,1); double ma2 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,2); double sma1 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,1); double sma2 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,2); double sar1 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,1); double sar2 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,2); if(count(1)==0&&count(2)==0){ if(sar1 < ma1 && sar2 > ma2) { bool x = OrderSend (Symbol(),OP_BUY,LotSize,Ask,5,Ask - (StopLossPips*t),Ask + (TakeProfitPips*t),NULL,MagicNumber,0,Green); } } if(count(2)==0&&count(1)==0){ if(sar1 > ma1 && sar2 < ma2){ bool xx = OrderSend (Symbol(),OP_SELL,LotSize,Bid,5, Bid+ (StopLossPips*t),Bid -(TakeProfitPips*t),NULL,MagicNumber,0,Red); } } if (breakEven > 0)breakeven(); //---- return(0); } //+------------------------------------------------------------------+ void breakeven () { for (int i= OrdersTotal ()-1; i >=0;i--) { if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) if (OrderSymbol() == Symbol ()) if (OrderMagicNumber() == MagicNumber ) if (OrderType() == OP_BUY) if (Bid - OrderOpenPrice ()> breakEven*t ) if (OrderOpenPrice() > OrderStopLoss ()) bool xx= OrderModify (OrderTicket(),OrderOpenPrice (),OrderOpenPrice (),OrderTakeProfit(),0,Pink); } for (int ii= OrdersTotal()-1; ii >=0;ii--) { if (OrderSelect (ii,SELECT_BY_POS,MODE_TRADES)) if (OrderSymbol() == Symbol ()) if (OrderMagicNumber() == MagicNumber ) if (OrderType() == OP_SELL) if (OrderOpenPrice() - Ask > breakEven*t ) if (OrderOpenPrice() < OrderStopLoss ()) bool x= OrderModify (OrderTicket(),OrderOpenPrice (),OrderOpenPrice (),OrderTakeProfit(),0,Pink); } } int count(int t){ int T=0; for (int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if (OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber) { if(OrderType() == OP_BUY&&t==1)T++; if(OrderType() == OP_SELL&&t==2)T++; } } } return(T); }آخر تعديل بواسطة tradingsystem ، 18-09-2017 الساعة 01:37 AM
- 18-09-2017, 03:07 AM #13
- 18-09-2017, 10:05 AM #14
وتستطيع أن تكتب المعادلات بداخل الدالة ()Start بطريقة غير مباشرة وذلك بوضعهم بداخل الدالة void وتسميهم اي اسم مثلاً Indicators وتكتبهم بالاعلى هكذا وبعد ذلك تكتب ;()Indicators بداخل الدالة Start ولا يوجد فرق بين الحالتين.
كود:double ma1,ma2,sma1,sma2,sar1,sar2; void Indicators(){ ma1 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,1); ma2 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,2); sma1 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,1); sma2 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,2); sar1 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,1); sar2 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,2); }
وهذا الكود كامل
كود://+------------------------------------------------------------------+ //| Byu_Sell_Day.mq4 | //| Copyright © 2007, www.****forex.net | //| http://www.****forex.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, www.****forex.net" #property link "http://www.****forex.net" extern double LotSize=0.01; extern double StopLossPips=30; extern double TakeProfitPips=30; extern int MagicNumber = 55558; extern int breakEven = 20 ; extern int matimeframe = 240; extern int maperiod = 8; extern int mashift = 0; extern int mamethod = 0; extern int maappliedprice=0; extern int smatimeframe = 240; extern int smaperiod = 14; extern int smashift = 0; extern int smamethod = 0; extern int smaappliedprice=0; extern int sartimeframe=240; extern double sarstep=0.02; extern double sarmaximum=0.2; extern int sarshift=0; double buySL,buyTP,selSl,selTP; double ma1,ma2,sma1,sma2,sar1,sar2; void Indicators(){ ma1 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,1); ma2 = iMA(NULL,matimeframe,maperiod,mashift,mamethod,maappliedprice,2); sma1 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,1); sma2 = iMA (NULL,smatimeframe,smaperiod,smashift,smamethod,smaappliedprice,2); sar1 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,1); sar2 = iSAR (NULL,sartimeframe,sarstep,sarmaximum,2); } //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ double t; int init() { //---- double tik=MarketInfo(Symbol(),MODE_TICKSIZE); if(tik==0.00001 || tik==0.001) t=tik*10; else t=tik; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { Indicators(); if(count(1)==0&&count(2)==0){ if(sar1 < ma1 && sar2 > ma2) { if (StopLossPips ==0)buySL =0 ; else buySL =Ask - (StopLossPips*t); if(TakeProfitPips==0)buyTP=0; else buyTP = Ask +(TakeProfitPips*t); bool x = OrderSend (Symbol(),OP_BUY,LotSize,Ask,5,buySL,buyTP,NULL,MagicNumber,0,Green); } } if(count(2)==0&&count(1)==0){ if(sar1 > ma1 && sar2 < ma2){ if(StopLossPips ==0)selSl=0; else selSl= Bid+(StopLossPips*t); if(TakeProfitPips==0)selTP=0; else selTP=Bid -(TakeProfitPips*t); bool xx = OrderSend (Symbol(),OP_SELL,LotSize,Bid,5,selSl,selTP,NULL,MagicNumber,0,Red); } } if (breakEven > 0)breakeven(); //---- return(0); } //+------------------------------------------------------------------+ void breakeven () { for (int i= OrdersTotal ()-1; i >=0;i--) { if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) if (OrderSymbol() == Symbol ()) if (OrderMagicNumber() == MagicNumber ) if (OrderType() == OP_BUY) if (Bid - OrderOpenPrice ()> breakEven*t ) if (OrderOpenPrice() > OrderStopLoss ()) bool xx= OrderModify (OrderTicket(),OrderOpenPrice (),OrderOpenPrice (),OrderTakeProfit(),0,Pink); } for (int ii= OrdersTotal()-1; ii >=0;ii--) { if (OrderSelect (ii,SELECT_BY_POS,MODE_TRADES)) if (OrderSymbol() == Symbol ()) if (OrderMagicNumber() == MagicNumber ) if (OrderType() == OP_SELL) if (OrderOpenPrice() - Ask > breakEven*t ) if (OrderOpenPrice() < OrderStopLoss ()) bool x= OrderModify (OrderTicket(),OrderOpenPrice (),OrderOpenPrice (),OrderTakeProfit(),0,Pink); } } int count(int t){ int T=0; for (int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if (OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber) { if(OrderType() == OP_BUY&&t==1)T++; if(OrderType() == OP_SELL&&t==2)T++; } } } return(T); }
- 18-09-2017, 06:18 PM #15