تحية طيبة لكم اعزائي المبرمجين
هذا الاكسبرت هو الاكسبرت الاصلي الذي يأتي مع برنامج الميتاتريدر4
ولكني قمت ببعض التعديلات بخصوص شروط فتح الصفقات ونجح الامر معي 100% بدون اي مشاكل
ولكني الآن اريد تعديل شروط اغلاق الصفقات وهنا توقف دماغي عن العمل لكوني غير متخصص في البرمجة واختصاصي الدراسي بعيد كل البعد عن لغات البرمجة
اولاً سأشرح لكم التعديلات التي قمت بها
ثم سأشرح لكم مالذي يحدث ثم سأشرح لكم المشكلة وما اريده ان يكون
في البداية اخذت الاكسبرت الاصلي moving average واجريت عليه التعديلات التالية
قمت باضافة خط موفنج افريج آخر
غيرت شروط فتح الصفقات
غير عدد الصفقات
قمت باضافة خاصية Take Profit
البرنامج حالياً يفتح الصفقات فقط وبشكل طبيعي ويتم اغلاق الصفقات بواسطة ال TakeProfit فقط
الآن اريد ان اضيف شرط ثاني لاغلاق الصفقات وقد كتبت الشرط وتم تنفيذه بدون اي مشكلة
المشكلة هي ان شرط الاغلاق لا يعمل نهائياً عندما يكون عدد الصفقات اكثر من 1
اي انه يعمل بشكل جيد اذا كان شرط فتح الصفقات مضبوط على صفقة واحدة فقط
انا اريده ان يغلق الصفقات في حالة ضبط البرنامج على فتح اكثر من صفقة واحدة
واريده ان يتحكم بكل صفقة على حدى
يعني اريد ان يغلق فقط الصفقات التي يتحقق فيها الشرط ومهما كان عددها
حالياً انا اقوم بضبط عدد الصفقات المفتوحة على 100 صفقة
الرجاء مساعدتي
لابد انها بسيطة جداً ولكن دماغي لم يعد يعمل
خرج عن الخدمة تماماً
هذا هو الكود كامل من الدنكة للدنكة
كود:
//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "www.mql4.com"
#property description "Moving Average sample expert advisor"
#define MAGICMA 20131114
//--- Inputs
extern string SIZE="حجم اللوت";
input double Lots =0.1;
input double MaximumRisk =0.1;
input double DecreaseFactor =45;
extern double Profit =0.001;
extern double Loss =0.0000;
extern string countLots="عدد العقود";
input int count = 100;
extern string Indicators="المؤشرات";
extern string Ma1="المعدل الاول";
input int MovingPeriod1 =440;
input int MovingShift1 =1;
extern string Ma2="المعدل الثاني";
input int MovingPeriod2 =36;
input int MovingShift2 =1;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//---
for(int i=count;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//--- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//--- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//--- calcuulate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//--- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma1;
int res;
//--- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//--- get Moving Average
ma1=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0);
//--- sell conditions
if( Close[1]<Close[2] && Close[2]<Close[3] && Close[1]<Close[3] && Close[3]>ma1 && Close[2]>ma1 && Close[1]>ma1)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Bid-Profit,"",MAGICMA,0,Red);
return;
}
//--- buy conditions
if( Close[1]>Close[2] && Close[2]>Close[3] && Close[1]>Close[3] && Close[3]<ma1 && Close[2]<ma1 && Close[1]<ma1)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,Ask+Profit,"",MAGICMA,0,Blue);
return;
}
//---
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma1;
double ma2;
double ma3;
//--- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//--- get Moving Average
ma1=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0);
ma2=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0);
ma3=iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0);
//---
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//--- check order type
if(OrderType()==OP_BUY)
{
if( OrderOpenPrice()> ma2 )
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
Print("OrderClose error ",GetLastError());
}
break;
}
if(OrderType()==OP_SELL)
{
if( OrderOpenPrice() <ma2 )
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
Print("OrderClose error ",GetLastError());
}
break;
}
}
//---
}
//+------------------------------------------------------------------+
//| OnTick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- check for history and trading
if(Bars<100 || IsTradeAllowed()==false)
return;
//--- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//---
}
//+------------------------------------------------------------------+
هذا هو الكود كامل من الدنكة للدنكة