موضوع مفيد جدا
ماشاء الله
Printable View
موضوع مفيد جدا
ماشاء الله
عندي سؤال
صممت مؤشر بسيط واريد ان احسب عدد المؤشرات التي الصقت في في الشارت في نفس الوقت من بنفس الاسم
مثال لنفترض ان اسم المؤشر DD ووضعته في الشارت ثم اضفته مرة أخرى في الشارت بنفس الاسم فيكون لدينا مؤشرين هما DD DD اذن عددهم يساوي 2
حاولت ووضعت هذه الاكواد
وضعت الاكواد في دالة initكود PHP:double Var;
int init()
{
if(GlobalVariableCheck("count")==true)
{
Var=GlobalVariableGet("count");
GlobalVariableSet("count",Var+1);
}
else{
Var=1;
GlobalVariableSet("count",Var);
}
Comment("Var =",Var);
//----
return(0);
}
int deinit()
{
//----
Var=Var-1;
//----
return(0);
}
حتى اذا اضفت المؤشر يحسب قيمة للمتغير الجلوبال واذا تم اضافة نفس المؤشر فانه يبحث عن المتغير جلوبال ويضيف له قيمة وعندما احذف المؤشر نفسه ينقص قيمة ولكن المشكلة كلما اغير من فريم الى فريم تتغير قيمة المتغير Var يعني عندما اضع المؤشر على فريم الساعة وانتقل الى فريم النصف ساعة او اعلى منع تتغير قيمة المتغير
اتمنى ان يكون سؤالي واضح
لأن الطبيعي عندما تقوم بتغيير التايم فريم فكأنك حذفت المؤشر وقمت بوضعه من جديد
بالتالي عندما تحذف المؤشر يجب أن تنقص القيمه 1 أنت أضفت هذا الكود في الداله deinit لكن لديك جزء ناقص بها
المفروض بعد أن تنقص قيمة
أن تقوم بحفظ القيمه الجديده مره أخرىكود PHP:Var=Var-1;
كود PHP:GlobalVariableSet("count",Var);
جربت واضفت ما ذكرت ولكن ينقص القيمة كلما غيرت من فريم الى الاخر
دالة deinit حسب فهمي هي عندما تحذف المؤشر تضع به كود لحذف object او حذف اشياء لكن طالما ان المؤشر موجود وتغير من فريم الى اخر لا يحذف
جرب مثلا وضع عملية جمع بسيطة لمتغير x =x+2
وضعها في ال deinit وضع تعليق ليبين القيمة x ستجد انه عند تغير الفريم الى اخر والمؤشر موجود فان قيمة x لا تظهر ولكن عند حذف المؤشر فان قيمة x تظهر وهنا دليل على ان وظيفة الدالة deinit هي عندما يحذف المؤشر فان هذه الدالة تنفذ مهمة محددة كما انه عندما يوضع المؤشر على الشارت فان دالة init تنفذ فقط مهمة محددة يعني هذه الدالة لها مهمة واحدة فقط وهي عند حذف المؤشر او الاكسبيرت
السلام عليكم
الأخوة الاعزاء أرجو المساعده في الدوال البرمجية لفكرة الاكسبرت التالية
قمت بعمل اكسبرت يفتح صفقات سواء بيع او شراء طبقا لشروط معينه عند الساعه 0 كل يوم
واذا أتت الصفقه بهدفها ينتهي عمله طيلة اليوم والانتظار لليوم التالي
اما اذا لم يحقق هدفه تبدا عملية المضاعفة بضعف اللوت السابق
قمت بعمل التالي
عمل دالة خارج الداله ستارت لاستدعاء قيمة اخر لوت من الهيستري
عمل داله اخرى لمعرفة هل كانت اخر صفقة رابحه ام خاسرة
والامر تمام
ولكني أرغب عندما يتم الوصول لرقم مضاعفة معينة وعملته متغير خارجي واسميته MaxLot ألا يقوم بعمل مضاعفات أخرى والانتظار لبداية يوم جديد ومن ثم الدخول باللوت المبدئي LotSize
بمعنى عندما يتم الدخول في المضاعفات يتوقف عند المضاعفة MaxLot وبعدها يبدا عمله من جديد عند بداية اليوم الجديد مثلما تم برمجتة باللوت المبدئي
وأشكر تعاونكم
وتحياتي للأخ مستر دولار والعزيز الغالي الاستاذ جميل
وبارك الله فيكم
أوك شكرا أخي العزيز الاستاذ أسامة
قمت اولا بتعريف متغير خارجي كالتالي
ثم خارج دالة ستارت قمت بعمل دالة لاستدعاء قيمة اللوت لأخر صفقة كالتاليكود PHP:extern double Maxlot=0.8;
وداخل الدالة ستارت وضعت التاليكود PHP:double LastOrderLots()
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
return(OrderLots());
}
}
return(0);
}
كود PHP:if(Time0!=Time[0] && (Sell_order-Buy_order)>=Min_Distance_Between_Orders*point && (Sell_order-Buy_order)<=Max_Distance_Between_Orders*point && MyOrdersTotal(MagicNumber)==0){Excute(0);Excute(1);}
وهذه دالة خارج الدالة ستارت لتنفيذ الصفقات
وهذه دالة المضاعفات في حالة ضرب الاستوب وعكس الاوامر من نقطة الاستوب لوزكود PHP://+------------------------------------------------------------------+
void Excute(int Direction)
{
if(Direction==0)
{
if(TakeProfit==0){TP=0;}else{TP=Buy_order+TakeProfit*point+Spread*point;}
if(StopLoss==0){SL=0;}else{SL=Buy_order-StopLoss*point;}
OrderSend(Symbol(),OP_BUYLIMIT,LotSize,(Buy_order+Spread*point),Slippage*D,SL,TP,"walid EA",MagicNumber,0,Blue);
Time0=Time[0];
}
if(Direction==1)
{
if(TakeProfit==0){TP=0;}else{TP=Sell_order-(TakeProfit*point);}
if(StopLoss==0){SL=0;}else{SL=Sell_order+(StopLoss*point+Spread*point);}
OrderSend(Symbol(),OP_SELLLIMIT,LotSize,Sell_order,Slippage*D,SL,TP,"walid EA",MagicNumber,0,Red);
Time0=Time[0];
}
}
وهذه دوال أخرى مساعدة خارج الدالة ستارتكود PHP:void CheckForOrders ()
{
if(orderscnt(OP_BUY)>0&&orderscnt(OP_SELLSTOP)==0 )
{
DeletePendingOrder(OP_SELLLIMIT);
if(TakeProfit==0){TP=0;}else{TP=StopLossOrder(OP_BUY)-TakeProfit*point-Spread*point;}
if(StopLoss==0){SL=0;}else{SL=StopLossOrder(OP_BUY)+StopLoss*point+Spread*point;}
OrderSend(Symbol(),OP_SELLSTOP,LotsOrder(OP_BUY)*Multiplier,StopLossOrder(OP_BUY),Slippage*D,SL,TP,"walid EA",MagicNumber,0,Red);
}
if(orderscnt(OP_SELL)>0&&orderscnt(OP_BUYSTOP)==0 )
{
DeletePendingOrder(OP_BUYLIMIT);
if(TakeProfit==0){TP=0;}else{TP=StopLossOrder(OP_SELL)+TakeProfit*point+Spread*point;}
if(StopLoss==0){SL=0;}else{SL=StopLossOrder(OP_SELL)-StopLoss*point;}
OrderSend(Symbol(),OP_BUYSTOP,LotsOrder(OP_SELL)*Multiplier,StopLossOrder(OP_SELL),Slippage*D,SL,TP,"walid EA",MagicNumber,0,Blue);
}
if(orderscnt(OP_BUY)+orderscnt(OP_SELL)==0)
{
DeletePendingOrder(OP_BUYSTOP);
DeletePendingOrder(OP_SELLSTOP);
}
}
وبكدة يكون أكواد الاكسبرت بالكامل موجودهكود PHP://+------------------------------------------------------------------+
int orderscnt(int type){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol()&&OrderType()==type && MagicNumber==OrderMagicNumber()){
cnt++;
}
}
}
return(cnt);
}
//+------------------------------------------------------------------+
double StopLossOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
return(OrderStopLoss());
}
}
return(0);
}
//+------------------------------------------------------------------+
double LotsOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
return(OrderLots());
}
}
}
//+------------------------------------------------------------------+
void DeletePendingOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
OrderDelete(OrderTicket());
}
}
}
//+------------------------------------------------------------------+
int MyOrdersTotal(int Magic)
{
int c=0;
int total = OrdersTotal();
for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
{
c++;
}
}
return(c);
}
وفكرة الاكسبرت أخي اسامة كالتالي
عند دخول الاكسبرت صفقة في بداية الساعه 0 بيفتح امرين سيل ليمت وباي ليمت وعند تفعيل احدها يقوم بحذف الامر الاخر وفي نفس الوقت يفتح ضعف العقد المفتوح من نقطة الاستوب لوز له صفقة معاكسة ستوب
وتبدا عملية المضاعفات لحين تحقيق الهدف خلال نفس اليوم اما اذا حقق الهدف يخرج ,وينتظر بداية يوم جديد ومن ثم الدخول باللوت المبدئي LotSize
المطلوب تحديد حد اقصى للمضاعفات عن طريق المتغير الخارجي MaxLot بحيث اذا تم الوصول لهذا الرقم لا يفتح اي صفقات اخرى خلال هذا اليوم والانتظار لافتتاح يوم عمل جديد ومن ثم العودة من جديد باللوت المبدئي
جزاك الله عني كل خير
ستقوم بعمل دالة لمعرفة توقيت إفتتاح آخر صفقة بالتالي معرفة هل جاء يوم جديد لم تفتح فيه صفقات أم لا
ثم قمت بإضافة التعديل على دالة وضع الأوامر المضاعفهكود PHP:datetime LastOrderTime()
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
return(OrderOpenTime());
}
}
return(0);
}
بالتالي إذا كان حجم اللوت أكبر من أقصى حجم لوت فلن يفتح صفقات إلا إذا كان يوم جديد جاء ويصبح حجم اللوت هو الإبتدائيكود PHP:void CheckForOrders ()
{
double NewLot;
if(orderscnt(OP_BUY)>0&&orderscnt(OP_SELLSTOP)==0&&LotsOrder(OP_BUY)<MaxLot||LastOrderTime()<iTime(Symbol(),1440,0))
{
DeletePendingOrder(OP_SELLLIMIT);
if(TakeProfit==0){TP=0;}else{TP=StopLossOrder(OP_BUY)-TakeProfit*point-Spread*point;}
if(StopLoss==0){SL=0;}else{SL=StopLossOrder(OP_BUY)+StopLoss*point+Spread*point;}
if(LotsOrder(OP_BUY)>MaxLot)NewLot=LotSize;
else NewLot=LotsOrder(OP_BUY)*Multiplier;
OrderSend(Symbol(),OP_SELLSTOP,NewLot,StopLossOrder(OP_BUY),Slippage*D,SL,TP,"walid EA",MagicNumber,0,Red);
}
if(orderscnt(OP_SELL)>0&&orderscnt(OP_BUYSTOP)==0&&LotsOrder(OP_SELL)<MaxLot||LastOrderTime()<iTime(Symbol(),1440,0) )
{
DeletePendingOrder(OP_BUYLIMIT);
if(TakeProfit==0){TP=0;}else{TP=StopLossOrder(OP_SELL)+TakeProfit*point+Spread*point;}
if(StopLoss==0){SL=0;}else{SL=StopLossOrder(OP_SELL)-StopLoss*point;}
if(LotsOrder(OP_SELL)>MaxLot)NewLot=LotSize;
else NewLot=LotsOrder(OP_SELL)*Multiplier;
OrderSend(Symbol(),OP_BUYSTOP,NewLot,StopLossOrder(OP_SELL),Slippage*D,SL,TP,"walid EA",MagicNumber,0,Blue);
}
if(orderscnt(OP_BUY)+orderscnt(OP_SELL)==0)
{
DeletePendingOrder(OP_BUYSTOP);
DeletePendingOrder(OP_SELLSTOP);
}
}
جزاك الله كل خيرا استاذ أسامة ظبط الاكسبرت ما شاء الله عليك
جعلك الله دائما مرجع لنا
تحياتي لشخصكم الكريم وجمعة مباركة