رد:موضوع مخصص للأسئلة البرمجية
أستاذي مستر دولار في المحاضرة السابعة درسنا تعليق الأوامر وكانت بوضع حلقة لتحديد العدد ، عند التنفيذ لايتوقف عند 3 اوامر ويعلق المئات مالم اسيطر على الأومر بأستخدام دوال أخرى اضافية فهل هذا الكود سليم ؟؟
فأذا كان كذلك فلماذا لايتوقف عند العدد وأذا كان خطأ فأين الخطأ ، جزاك الله خير .
كود PHP:
for(int i=1; i<=3; i++){
double price = NormalizeDouble(Ask, Digits) + (Step*i*pt*Point);
double SL = price - Stoploss*pt*Point;
if (0 == 0) SL = 0;
double TP = price + Takeprofit*pt*Point;
if (0 == 0) TP = 0;
OrderSend(Symbol(), OP_BUYSTOP, Lots, price, 4, SL, TP, "My Expert", MagicNo, 0, Blue);
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
وعليكم السلام ورحمة الله وبركاته
بالنسبه للإكسبرت حاليا فالشروط صحيحه وهو يفتح صفقات لكن الصفقات قليله بسبب الشرط PIPS_FROM_TENKAN
مؤشر GenesisMatrix يحتاج إلى مؤشر آخر ليعمل بإسم T3_2ColorHisto فيجب أن تتأكد أنه موجود في مجلد المؤشرات
لا يمكنك تعريف دالتين cross بنفس الإسم يجب أن تقوم بتغيير الإسم
الشرط
كود PHP:
lastype(OP_SELL)==OP_SELL
لا أعلم ما الفائده منه فطبيعي بما أنك إخترت في متغيرات الداله OP_SELL فسوف يعود بنفس الصفقه
تمام أستاذ أسامه و شكرا جزيلا .. بالنسبه للشرط كود PHP:
lastype(OP_SELL)==OP_SELL
كنت أود أن أقارن إذا كانت آخر صفقه نوعها شراء أو بيع ... فهل ممكن أن أضعه هكذا و يكون صحيحا كشرط كود PHP:
lastype(OP_SELL)
؟
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة fxsmartsniper
شكرا اخي علي الرد
تم التعديل
كل OP_SELLالي OP_BUY والعكس
كل Bidالي Askوالعكس
كل
OP_BUYLIMIT تحول إلى OP_SELLSTOP
OP_SELLLIMIT تحول إلى OP_BUYSTOP
والعكس
كل Bidالي Askوالعكس
وكن عندي سوال
هل في اوامر الشراء او الشراء المعلق بنوعية لابد ان يكون في المعادلةAsk
و
هل في اوامرالبيع اوالبيع المعلق بنوعية لابد ان يكون في المعادلةBid
حيث اني بعد التحويل وجدت بعض الجمل عكس ذلك لا ادري هل ذلك خطا مني ام هذا من شروط الاستراتيجية علي ما اظن
شكرا مستر دولار:015:
مرفق الاكسبرت بعد تعديلي
في أوامر الشراء يجب أن يكون Ask وفي البيع يجب أن يكون Bid تماما مثل سعر الدخول يدويا
أما بالنسبه للأمر المعلق فحتى إذا جعلت مثلا في الشراء Bid+ عدد النقاط فلن تفرق كثيرا إلا عدد نقاط الإسبريد فبدلا من أن السعر مثلا سيكون أمر معلق 1.4050 فسوف يصبح 1.4047
بالنسبه للتعديل فهو صحيح
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة mostafa400
السلام عليكم ورحمة الله وبركاته
ممكن شرح لهذين الأمرين case - switch
مع وضع مثال للإستخدام للتوضيح لو تكرمتم
وجزاكم الله خيرا .
وعليكم السلام ورحمة الله وبركاته
switch تستخدم لتقارن بين القيمة المدخله وكل حاله في case وعند تحقق الشرط ينفذ الأمر
مثال
كود PHP:
int Number;
switch(Number)
{
case 1:Print("Number is 1");break;
case 2:Print("Number is 2");break;
case 3:Print("Number is 3");break;
default:Print("None");break;
}
لنفرض أن المتغير Number سيأخذ أي قيمة عند تحقق الحاله الأولى أي أن قيمة Number = 1 فإنه يطبع الجمله الأولى
عند تحقق الحاله الثانيه أي أن قيمة Number تساوي 2 فسيطبع الجمله الثانيه
عند تحقق الحاله الثالثه أن قيمة Number تساوي 3 سيطبع الجمله الثالثه
في حال عدم تحقق أي الشروط السابقه فسوف يطبع None
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
تمام أستاذ أسامه و شكرا جزيلا .. بالنسبه للشرط كود PHP:
lastype(OP_SELL)==OP_SELL
كنت أود أن أقارن إذا كانت آخر صفقه نوعها شراء أو بيع ... فهل ممكن أن أضعه هكذا و يكون صحيحا كشرط كود PHP:
lastype(OP_SELL)
؟
يمكنك عمل دالة لمعرفة نوع آخر صفقه
كود PHP:
int LastOrderType()
{
for (int cnt = OrdersTotal()-1 ; cnt > 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
return(OrderType());
}
}
return(-1);
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
يمكنك عمل دالة لمعرفة نوع آخر صفقه
كود PHP:
int LastOrderType()
{
for (int cnt = OrdersTotal()-1 ; cnt > 0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
return(OrderType());
}
}
return(-1);
}
تمام أستاذ أسامه .. ج زاك الله خيرا .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة mostafa400
شكرا جزيلا أستاذ / أسامة
معلش سؤال كمان
هل هناك فرق بين OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
OrderSelect(i, SELECT_BY_POS); بدون MODE_TRADES هل لها تأثير
وجزاك الله خيرا
لا يوجد فرق لأنك إذا لم تكتب MODE_TRADES فسوف تعتبرها الداله أنها الإعدادات الإفتراضيه والإعدادات الإفتراضيه لها هي MODE_TRADES
رد:موضوع مخصص للأسئلة البرمجية
السلام عليكم أستاذ اسامه
ما الخطأ بهذه الداله
كود PHP:
string firstclosed()
{
for(int i=1;i>=OrdersHistoryTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice()) return("profit");
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()) return("loss");
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()) return("profit");
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()) return("loss");
}
}
return("none");
}
و هي تعود بكلمة profit أو loss في حالة الربح أو الخساره ..
و إذا أردت أن يغلق الإكسبيرت باقي الصفقات المفتوحه إذا أغلقت أول صفقه منهم على ربح أو خساره هل ينفع أي من هذين الشرطين
كود PHP:
if (firstclosed()=="lost" || firstclosed()=="profit" && orderscnt(OP_BUY)+orderscnt(OP_SELL)>1) { CloseOrders();}
///أو ///
if ( TP==OrderTakeProfit() || SL== OrderStopLoss() ) { CloseOrders();}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة imaddine1986
السلام عليكم
ممكن شرح لطريقة عمل اكسبيرت مضاعفات
فقد قمت ببرمجت اكسبيرت على شارة الرينكو
فكرته بسيطة يفتح صفقة شراء مثلا ولا يخرج منها
الا عند اغلاق شمعة نازلة ويدخل مباشرة بيع
ما ارده هو دالة تقوم بمراقبة الصفقة اول ما تاتي اشارة
عكسية فلو كانت الصفقة رابحة يغلقها ويدخل من جديد
لو كانت خاسرة اي اوقات التذبذب يحافظ عليها ويدخل بصفقة
عكسية +1 لوت ويستمر لو كانت شمعة عكسية يراقب لو
كان مجموع الصفقتين خسارة يحافظ عليهما ويدخل بلوت +1
مع الشمعة العكسية اي في نفس انتجاهها ولا يخرج حتى
يكون مجموع الصفقات موجب عند الاشارة العكسية
المضاعفات تكون 1 2 3 4 5 6 7 8 9
فقد بحث على موضوع تعليمي للمضاعفات لكن لم اجد للاسف
بالنسبة للكود البرمجي فهو
كود PHP:
double TP,SL;
if(TrailingStop>0)MoveTrailingStop();
//////////////////////////////////////////////////
double openprice,lots,newLot;int s;
if(UseMultiplier){
for(s=0;s<OrdersTotal();s++){
OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==OP_BUY){
openprice=OrderOpenPrice();lots=OrderLots();
}
}{
هنا قمت بجعل المضاعف + وكمتغير خاجي جعلت Multiplier =1
حتى تكون المضاعفات 1 2 3 4 5 6
newLot=Multiplier+lots;
if(Ask<=openprice-Step*point&&orderstotal()>=1){
if(TakeProfit==0){TP=0;}else{TP=Ask+TakeProfit*point;}
OrderSend(Symbol(),OP_BUY,newLot,NormalizeDouble(Ask,digits),3,0,TP," ",MagicNumber,0,Blue);
}
}
for(s=0;s<OrdersTotal();s++){
OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==OP_SELL){
openprice=OrderOpenPrice(); lots=OrderLots();
}
}{
newLot=Multiplier+lots;
if(Bid>=openprice+Step*point&&orderstotal()>=1){
if(TakeProfit==0){TP=0;}else{TP=Bid-TakeProfit*point;}
OrderSend(Symbol(),OP_SELL,newLot,NormalizeDouble(Bid,digits),3,0,TP,"",MagicNumber,0,Red);
}
}
}
//////////////////////////////////////////////////
static datetime NewBar;
if(orderstotal()==0)
{
// close orders
}
double Cl1=iClose(0,0,1);
double Cl2=iClose(0,0,2);
//////////////////////////////////////////////////
if(NewBar<Time[0])
if(Cl2<Cl1)
{CloseSellOrders();}
if(Cl2>Cl1)
{CloseBuyOrders();}
if(profit()>=ProfitTarget){
while(orderstotal()>0){CloseSellOrders();CloseBuyOrders();}
هنا المشكلة الاولى كيف اجعله يحافظ على الصفقات الخاسرة
دون اغلاقها
}
{
// close orders
}
//////////////////////////////////////////////////
if(Cl2<Cl1) {
if(orderstotal()<MaxTrades&&Time0!=Time[0])
{
{
// open orders
Time0=Time[0];
}
//Buy
if(TakeProfit==0){TP=0;}
else{TP=Ask+TakeProfit*point;}
if(StopLoss==0){SL=0;}
else{SL=Ask-StopLoss*point;}
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SL,TP,"",MagicNumber,0,Blue);
}
}
//////////////////////////////////////////////////
if(Cl2>Cl1){
if(orderstotal()<MaxTrades&&Time0!=Time[0])
{
{
// open orders
Time0=Time[0];
}
//Sell
if(TakeProfit==0){TP=0;}
else{TP=Bid-TakeProfit*point;}
if(StopLoss==0){SL=0;}
else{SL=Bid+StopLoss*point;}
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,TP,"",MagicNumber,0,Red);
}
}
return(0);
}
//+------------------------------------------------------------------+
void CloseBuyOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
}
}
}
void CloseSellOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
}
}
void MoveTrailingStop()
{
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
if(TrailingStop>0&&NormalizeDouble(Ask-TrailingStep*point,digits)>NormalizeDouble(OrderOpenPrice()+TrailingStop*point,digits))
{
if((NormalizeDouble(OrderStopLoss(),digits)<NormalizeDouble(Bid-TrailingStop*point,digits))||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*point,digits),OrderTakeProfit(),0,Blue);
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+TrailingStep*point,digits)<NormalizeDouble(OrderOpenPrice()-TrailingStop*point,digits))
{
if((NormalizeDouble(OrderStopLoss(),digits)>(NormalizeDouble(Ask+TrailingStop*point,digits)))||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*point,digits),OrderTakeProfit(),0,Red);
}
}
}
}
}
}
اعتمدت هنا على دالة اغلاق على ربح معين لكن لو امكن
جعل الطريقة كما شرحتها يخرج عند اشارة عكسية مهما كان
الربح كبير او صغير او حتى على نقطة التعادل
double profit(){
double c;
for(int i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
c=c+OrderProfit();
}
}
return(c);
}
وبارك الله فيك
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
السلام عليكم أستاذ اسامه
ما الخطأ بهذه الداله
كود PHP:
string firstclosed()
{
for(int i=1;i>=OrdersHistoryTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice()) return("profit");
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()) return("loss");
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()) return("profit");
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()) return("loss");
}
}
return("none");
}
و هي تعود بكلمة profit أو loss في حالة الربح أو الخساره ..
و إذا أردت أن يغلق الإكسبيرت باقي الصفقات المفتوحه إذا أغلقت أول صفقه منهم على ربح أو خساره هل ينفع أي من هذين الشرطين
كود PHP:
if (firstclosed()=="lost" || firstclosed()=="profit" && orderscnt(OP_BUY)+orderscnt(OP_SELL)>1) { CloseOrders();}
///أو ///
if ( TP==OrderTakeProfit() || SL== OrderStopLoss() ) { CloseOrders();}
وعليكم السلام ورحمة الله وبركاته
بداية البحث يجب أن تكون من i=0 حتى i أكبر من فقط وليس أكبر من أو تساوي
لأن عدد الصفقات المغلقه مثلا لو كانت 5 صفقات فأرقامها تكون من 0 إلى 4
بالنسبه للشرط فسيكون صحيح لكن ستواجهك مشكله لنفرض أن الصفقات أغلقت وأردت أن تبدأ سلسله جديده
فمجرد أن تفتح صفقه لتبدأ سلسله جديده ستجد أن الشرط قد تحقق أيضا وستغلق الصفقه مباشره
لذلك ستحتاج عمل دالة نفس الداله السابقه لكن مع إضافة شرط لتحديد الصفقه التي أغلقت بناء على الوقت أيضا كمثال