:hands:
https://forum.arabictrader.com/t170512.html
:00012:
Printable View
:hands:
https://forum.arabictrader.com/t170512.html
:00012:
تفضل هذه الداله ستقبل الأرقام الصحيحه والأرقام العشريه
كود PHP:double BinaryNumber(double Number)
{
string FloatValue;
int IntPart=Number;
double FloatPart=Number-IntPart;
int Reminder,Binary;
int i=1;
while(IntPart>0)
{
Reminder=IntPart%2;
Binary=Binary + (i*Reminder);
IntPart=IntPart/2;
i=i*10;
}
int Repeats;
if(FloatPart>0)
{
while(FloatPart!=1&&Repeats<50)
{
Repeats++;
FloatPart*=2;
if(FloatPart<1)
{
FloatValue=FloatValue+"0";
}
else if(FloatPart>=1)
{
FloatValue=FloatValue+"1";
FloatPart--;
}
}
}
return(Binary+StrToDouble("."+FloatValue));
}
ستستخدم نفس دالة التريلينج ستوب لكن بدلا من أن تقارن الأستوب لوز للصفقه بالسعر الحالي ستقرن سعر وضع الأمر المعلق مع السعر الحالي وإذا كان السعر أكبر مثلا من المسافه المحدده يتم تعديل الأمر OrderModify
لكن تقوم بتغيير سعر الأمر المعلق وليس الأستوب لوز
أذكر أني قمت بعمل نفس الداله سابقا في سؤال سابق جرب عملها
السلام عليكم استاذى الكريم
وجزاك الله خير على المساعدة الكريمة
استاذى الكريم
كنت اطمع من كرمك بعمل هذه الدالة
بطريقة
يوجد صفقة بيع وتعليق صفقة بيع لميت
على بعد مسافة الاستيب
مع تحرك صفقة البيع الى 10 نقاط يتحرك الامر المعلق الى اسفل
ولو كانت الصفقة شراء يتم تعليق صفقة شراء لميت
ومع تحرك السعر الى الربح 10 يتحرك الصفقة المعلة كل 10 نقاط
ارجو المساعدة الكريمة من شخصك الكريم فى عمل هذه الدالة
وجزاك الله عنا كل خير
كود PHP:void MoveTrailingStop()
{
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_SELL)
{
if(TrailingStop>0&&NormalizeDouble(Ask-TrailingStep*pt,Digits)>NormalizeDouble(OrderOpenPrice()+TrailingStop*pt,Digits))
{
if((NormalizeDouble(OrderOpenPrice(),Digits)<NormalizeDouble(Bid-TrailingStop*pt,Digits)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*pt,Digits),OrderTakeProfit(),0,Blue);
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+TrailingStep*pt,Digits)<NormalizeDouble(OrderOpenPrice()-TrailingStop*pt,Digits))
{
if((NormalizeDouble(OrderOpenPrice(),Digits)>(NormalizeDouble(Ask+TrailingStop*pt,Digits))))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*pt,Digits),OrderTakeProfit(),0,Red);
}
}
}
}
}
}
الاخ العزيز الذي استفدت منه كثيرا الاستاذ أسامه
أعلم يا اخي اني أحبك كثيرا في الله لاني استفدت كثيرا في تعلم البرمجةعلى يدك وعلى كل الاكسبرتات مفتوحة الكود التي تضعها بمشاركاتك جزاك الله عني وعن كل مستفيد منها كل الخير
طلب صغير لو تكرمت وهو أولى طلباتي البرمجية من حضرتك او الأخوة المبرمجين أعضاء الموقع الكرام
قمت بتصميم اكسبرت بسيط وهو أولى اكسبرتاتي لعلها تكون بداية خير ان شاء الله ولكن وقفت ومش قادر اكمل لعجزي الشديد في المحاولات وسهر الليالي لايجاد حل لمثل تلك الاكواد التي احتاج من حضرتك حلها لي بارك الله فيك
فكرتي تتلخص في
1- احتاج الدالة المسؤلة عن احتساب الربح السابق لاخر صفقات مغلقة بواسطة الاكسبرت لمعرفة هل خسرت ام ربحت
2- احتاج الدالة المسؤلة عن مضاعفة الصفقات الخسرانه بالمتوالية الحسابية 1 2 4 8 16
فيا ريت تساعدني في ذلك
واحب اوضح فكرتي أكثر لحضرتك كالتالي
1- عند افتتاح شمعة ساعه يقوم الاكسبرت بالبحث عن هل يوجد صفقات مفتوحه من قبله ام لا فان كان الجواب لا يقوم بفتح صفقة جديده حسب شروط الدخول بيع او شراء باللوت المبدئي كمتغير خارجي من متغيرات الاكسبرت يعني ألا يكون هناك اي صفقات مفتوحه اطلاقا
2- في حالة الوصول للربح المطلوب TakeProfit او ضرب StopLoss يقوم الاكسبرت بفتح صفقة جديدة مع افتتاح الشمعه الجديدة ( شمعة الساعة ) ولكن اذا كانت الصفقة السابقة ضربت StopLoss يقوم بالدخول بلوت ضعف اللوت السابق اما لو حققت الهدف فيدخل على حسب اللوت المبدئي من جديد وهكذا
بمعنى أوضح يكون شروط الدخول العادي (( بدون مضاعفات ))
أ - لا يوجد أي صفقات مفتوحة من قبل الاكسبرت
ب - ان تكون الصفقة السابقة حققت هدفها
ج - لا يفتح اي صفقات جديدة مع بداية شمعة الساعه طالما يوجد صفقة مفتوحه لم تحقق هدف او خسارة
أما شروط الدخول مضاعفات 1 2 4 8 16 ..... الخ فهي كالتالي
أ- لا يوجد أي صفقات مفتوحة من قبل الاكسبرت
ب- الصفقة السابقة سواء كانت بيع او شراء ضربت StopLoss
كما أرجو التكرم بوضح الأكواد البرمجية وترك مكان فارغ لوضع شروط الدخول بيع وشراء فيه
جزاك الله خير استاذ أسامة
تقبل خالص تحياتي
الأخ العزيز استاذ أسامة راجعت مشاركاتك وردودك مع باقي الاخوة الاعضاء ووصلت إلى ضالتي
ولكن
دائما الاكسبرت لا يفتح أي صفقات ويظهر لي خطأ في الجورنال 4051
invalid lots amount for ordersend function
سوف ارفق الكود طمعا في كرمك لتعليم باقي الاعضاء
جزاك الله خير
المطلوب تحديدا من الاكسبرت هو
- عند افتتاح كل شمعة جديدة يقوم بالبحث عن
هل يوجد صفقات مفتوحة ام لا
هل تم اغلاق الصفقة السابقة بربح ام خسارة
فان كان يوجد صفقات مفتوحة فلا يقوم بفتح أي صفقة جديدا اطلاقا
أما اذاكانت لا توجد أي صفقات مفتوحة فيقوم الاكسبرت بالبحث في الصفقات المغلقة هل اغلقت بربح ام خسارة فان اغلقت بربح فيقوم الاكسبرت بفتح صفقة جديدة باللوت المبدئي Lot أما ان كانت أخر صفقة خاسرة فيقوم بفتح صفقة جديدة بالمضاعفات 1 2 4 8 16 NewLot
بانتظار ردك أخي الكريم
كود PHP://+------------------------------------------------------------------+
//| Buy Multiplication Order conditions |
//+------------------------------------------------------------------+
if(OP>MAX && T!=Time[0]&& orderstotal()<1 && LastOrderProfit()<0 )
{
NewLot=LastOrderLots()*Multiplier;
if(TakeProfit==0){TP=0;}else{TP=Ask+TakeProfit*point;}
if(StopLoss==0){SL=0;}else{SL=Ask-StopLoss*point;}
OrderSend(Symbol(),OP_BUY,NewLot,NormalizeDouble(Ask,digits),3*D,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),"waleed EA",MagicNumber,0,Blue);
PlaySound("Alert.wav");
T=Time[0];
}
//+------------------------------------------------------------------+
//| Sell Multiplication Order conditions |
//+------------------------------------------------------------------+
if (OP<MIN && T!=Time[0] && orderstotal()<1 && LastOrderProfit()<0)
{
NewLot=LastOrderLots()*Multiplier;
if(TakeProfit==0){TP=0;}else{TP=Bid-TakeProfit*point;}
if(StopLoss==0){SL=0;}else{SL=Bid+StopLoss*point;}
OrderSend(Symbol(),OP_SELL,NewLot,NormalizeDouble(Bid,digits),3*D,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),"Waleed EA",MagicNumber,0,Red);
PlaySound("Alert.wav");
T=Time[0];
}
//+------------------------------------------------------------------+
//| Buy Order conditions |
//+------------------------------------------------------------------+
if(OP>MAX && T!=Time[0] && orderstotal()<1)
{
if (StopLoss==0)SL=0;else SL=Ask-StopLoss*point;
if (TakeProfit==0)TP=0; else TP=Ask+TakeProfit*point;
OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,digits),3*D,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),"Waleed EA",MagicNumber,0,Blue);
PlaySound("Alert.wav");
T=Time[0];
}
//+------------------------------------------------------------------+
//| Sell Order conditions |
//+------------------------------------------------------------------+
if (OP<MIN && T!=Time[0] && orderstotal()<1)
{
if (StopLoss==0)SL=0; else SL=Bid+StopLoss*point;
if (TakeProfit==0) TP=0; else TP=Bid-TakeProfit*point;
OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,digits),3*D,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),"Waleed EA",MagicNumber,0,Red);
PlaySound("Alert.wav");
T=Time[0];
}
وعليكم السلام ورحمة الله وبركاته
تفضل هذا كمثال
إذا كنت تضع هدف وستوب لوز للأمر المعلق فسوف تحتاج أيضا إلى تعديله بناء على سعر الأمر المعلق الجديدكود PHP:void MoveTrailingPending()
{
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_SELLLIMIT)
{
if(NormalizeDouble(OrderOpenPrice(),Digits)>NormalizeDouble(Bid+Step*pt,Digits))
{
OrderModify(OrderTicket(),NormalizeDouble(Bid+Step*pt,Digits),OrderStopLoss(),OrderTakeProfit(),0,Blue);
}
}
else if(OrderType()==OP_BUYLIMIT)
{
if(NormalizeDouble(OrderOpenPrice(),Digits)<NormalizeDouble(Ask-Step*pt,Digits))
{
OrderModify(OrderTicket(),NormalizeDouble(Ask-Step*pt,Digits),OrderStopLoss(),OrderTakeProfit(),0,Red);
}
}
}
}
}
أولا سوف تحتاج إلى دالة لمعرفة ربح آخر صفقة
مثال
ثم ستحتاج دالة لمعرفة حجم لوت آخر صفقه أغلقتكود PHP:double LastOrderProfit()
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
return(OrderProfit());
}
}
return(0);
}
مثال
ثم ستضع من ضمن شروط الدخول في الصفقه وقبل أمر فتح الصفقه مباشرهكود PHP:double LastOrderLot()
{
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
return(OrderLots());
}
}
return(0);
}
مثلا إذا كان الأمر القادم شراء
المتغير FirstLot هو حجم اللوت الإبتدائي الموجود في المتغيرات الخارجيه أو مهما كان الإسم الذي وضعتهكود PHP:double NewLot;
if(LastOrderProfit()<0)NewLot=LastOrderLot()*2;
else NewLot=FirstLot;
OrderSend(Symbol(),OP_BUY,NewLot,NormalizeDouble(Ask,Digits),3,SL,TP,"EA",MagicNumber,0,Blue);
شكرا استاذ اسامه والله العظيم برنس
ربنا يخليك لينا يا استاذنا
وأرجو تقبل أسئلتي الكثيره المرات القادمة لأني بدأت جديا في طريق تعلم البرمجة
جزاك الله خير
استاذ سمير
انا اريد ان اقرا البيانات لليوم السابق عن طريق المنصة الى ملف اكسل وقمت بتنفيذ شرح الاستاذ مستر دولار ولكن البيانات التي تظهر هي لليوم الحالي مرفق الصورة انا احتاج
الافتتاح + والاغلاق + والهاي + واللو لليوم السابق
ولكم جزيل الشكر المقدم