رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة abou fares
شكرا استاذ اسامة بارك الله فيك وجعل هذا العمل في ميزان حسناتك
بالتوفيق إن شاء الله
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة Niso
كود PHP:
#include <stdlib.mqh>
#include <WinUser32.mqh>
// exported variables
extern double SellLots11 = 0.01;
extern int SellStoploss11 = 0;
extern int SellTakeprofit11 = 40;
extern double BuyLots13 = 0.01;
extern int BuyStoploss13 = 0;
extern int BuyTakeprofit13 = 30;
extern double SellLots15 = 0.01;
extern int SellStoploss15 = 0;
extern int SellTakeprofit15 = 20;
// local variables
double PipValue=1; // this variable is here to support 5-digit brokers
bool Terminated = false;
string LF = "\n"; // use this in custom or utility blocks where you need line feeds
int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks
int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names
int current = 0;
int init()
{
NDigits = Digits;
if (false) ObjectsDeleteAll(); // clear the chart
Comment(""); // clear the chart
}
// Expert start
int start()
{
if (Bars < 10)
{
Comment("Not enough bars");
return (0);
}
if (Terminated == true)
{
Comment("EA Terminated.");
return (0);
}
OnEveryTick1();
}
void OnEveryTick1()
{
if (true == false && false) PipValue = 10;
if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;
IfOrderDoesNotExist10();
}
void IfOrderDoesNotExist10()
{
bool exists = false;
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
{
exists = true;
}
}
else
{
Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
}
if (exists == false)
{
SellOrder11();
}
}
void SellOrder11()
{
double SL = Bid + SellStoploss11*PipValue*Point;
if (SellStoploss11 == 0) SL = 0;
double TP = Bid - SellTakeprofit11*PipValue*Point;
if (SellTakeprofit11 == 0) TP = 0;
int ticket = -1;
if (true)
ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 7, 0, 0, "My Expert", 1, 0, Red);
else
ticket = OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 7, SL, TP, "My Expert", 1, 0, Red);
if (ticket > -1)
{
if (true)
{
OrderSelect(ticket, SELECT_BY_TICKET);
bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
if (ret == false)
Print("OrderModify() error - ", ErrorDescription(GetLastError()));
}
IfOrderDoesNotExist12();
}
else
{
Print("OrderSend() error - ", ErrorDescription(GetLastError()));
}
}
11111111111111111vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
void IfOrderDoesNotExist12()
{
bool exists = false;
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 2)
{
exists = true;
}
}
else
{
Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
}
if (exists == false)
{
BuyOrder13();
}
}
void BuyOrder13()
{
double SL = Ask - BuyStoploss13*PipValue*Point;
if (BuyStoploss13 == 0) SL = 0;
double TP = Ask + BuyTakeprofit13*PipValue*Point;
if (BuyTakeprofit13 == 0) TP = 0;
int ticket = -1;
if (true)
ticket = OrderSend(Symbol(), OP_BUY, BuyLots13, Ask, 4, 0, 0, "My Expert", 2, 0, Blue);
else
ticket = OrderSend(Symbol(), OP_BUY, BuyLots13, Ask, 4, SL, TP, "My Expert", 2, 0, Blue);
if (ticket > -1)
{
if (true)
{
OrderSelect(ticket, SELECT_BY_TICKET);
bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
if (ret == false)
Print("OrderModify() error - ", ErrorDescription(GetLastError()));
}
IfOrderDoesNotExist14();
}
else
{
Print("OrderSend() error - ", ErrorDescription(GetLastError()));
}
}
2222222222222222222vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
void IfOrderDoesNotExist14()
{
bool exists = false;
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 3)
{
exists = true;
}
}
else
{
Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
}
if (exists == false)
{
SellOrder15();
}
}
void SellOrder15()
{
double SL = Bid + SellStoploss15*PipValue*Point;
if (SellStoploss15 == 0) SL = 0;
double TP = Bid - SellTakeprofit15*PipValue*Point;
if (SellTakeprofit15 == 0) TP = 0;
int ticket = -1;
if (true)
ticket = OrderSend(Symbol(), OP_SELL, SellLots15, Bid, 4, 0, 0, "My Expert", 3, 0, Red);
else
ticket = OrderSend(Symbol(), OP_SELL, SellLots15, Bid, 4, SL, TP, "My Expert", 3, 0, Red);
if (ticket > -1)
{
if (true)
{
OrderSelect(ticket, SELECT_BY_TICKET);
bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
if (ret == false)
Print("OrderModify() error - ", ErrorDescription(GetLastError()));
}
}
else
{
Print("OrderSend() error - ", ErrorDescription(GetLastError()));
}
}
int deinit()
{
if (false) ObjectsDeleteAll();
عملت اكسبرت فكرته يفتح صفقة باتجاه واذا ارتد السعر بعدد نقاط معين يقوم بفتح صفقة في الاتجاه الاخر وهكذا
ارجو مساعدتك اخي الكريم جزاك الله خير
في كتابة الكود اللازم لكي يقوم بفتح صفقة معاكسة اذا ارتد السعر بعدد من النقاط وماكن وضعه في الاكسبرت بحيث( اقدر اغير عدد النقاط زي ما انا عاوز )
انا سايب علامات
1111vvvvvv
2222vvvvvvv
اماكن وضع الكود
انا جديد في برمجة الاكسبرتات واستعنت ببرنامج Forex EA Generatorفي الاكسبرت ده
اخيرا .. هل الاكسبرت ده ينفع يشتغل على اكتر من شارت في نفس الوقت من غير ميحصل لخبطة في الصفقات؟
في البدايه أنصحك بتعلم البرمجه من الكتب والمواضيع الموجوده في القسم وإبتعد عن هذا البرنامج لأن إمكانياته محدوده جدا ولن تستطيع تلبية رغباتك كلها عند برمجة إكسبرت بإستخدامه
بالنسبه للكود الذي تريده
فسوف تحتاج لعمل دالة لمعرفة نوع آخر صفقة مفتوحه وسعر دخولها
مثال
كود PHP:
int LastOrderType()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
return(OrderType());
}
return(-1);
}
double LastOrderPrice()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
return(OrderOpenPrice());
}
return(-1);
}
ثم ستضع في شروط الإكسبرت
كود PHP:
if(LastOrderType()==OP_SELL&&Ask-LastOrderPrice()>Step*Point)
{
double SL = Ask - BuyStoploss13*PipValue*Point;
if (BuyStoploss13 == 0) SL = 0;
double TP = Ask + BuyTakeprofit13*PipValue*Point;
if (BuyTakeprofit13 == 0) TP = 0;
OrderSend(Symbol(), OP_BUY, BuyLots13, Ask, 4, SL, TP, "My Expert", 2, 0, Blue);
}
if(LastOrderType()==OP_BUY&&LastOrderPrice()-Bid>Step*Point)
{
double SL = Bid + SellStoploss11*PipValue*Point;
if (SellStoploss11 == 0) SL = 0;
double TP = Bid - SellTakeprofit11*PipValue*Point;
if (SellTakeprofit11 == 0) TP = 0;
OrderSend(Symbol(), OP_SELL, SellLots11, Bid, 7, 0, 0, "My Expert", 1, 0, Red);
}
والمتغير Step سيكون هو المتغير الخارجي لعدد نقاط الإنعكاس بين الصفقات
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة imaddine1986
بارك الله فيك استاذي
اخر سؤال طريقة الحد من عدد المضاعفات
مثلا عند المضاعف 5 يتوقف على المضاعفات
ويعيد من جديد باول لوت
استاذ اسامة انا عملت دالت المضاعفات على هذا الشكل
كود PHP:
string last()
{
for(int i=OrdersHistoryTotal();i>=0;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()&& T!=Time[0]) return("profit");
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()&& T!=Time[0]) return("loss");
}
}
return("none");
}
ثم وقبل شرط الشراء والبيع عملت شرط المضاعفات
كود PHP:
if (last()=="loss"){Lots =LastOrderLots()*2;}
else
if(last()=="profit" || (last()!="profit" && last()!="loss") ) {Lots=0.1;}
بقيت المشكلة في تحديد عدد المضاعفات مثلا
التوقف عند المضاعف 5 وبالبدا من جديد
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة imaddine1986
استاذ اسامة انا عملت دالت المضاعفات على هذا الشكل
كود PHP:
string last()
{
for(int i=OrdersHistoryTotal();i>=0;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()&& T!=Time[0]) return("profit");
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()&& T!=Time[0]) return("loss");
}
}
return("none");
}
ثم وقبل شرط الشراء والبيع عملت شرط المضاعفات
كود PHP:
if (last()=="loss"){Lots =LastOrderLots()*2;}
else
if(last()=="profit" || (last()!="profit" && last()!="loss") ) {Lots=0.1;}
بقيت المشكلة في تحديد عدد المضاعفات مثلا
التوقف عند المضاعف 5 وبالبدا من جديد
تضيف في المتغيرات
كود PHP:
extern double MaxLots=12.8;
تضع فيها بدلا من 12.8 اكبر حجم لوت للمضاعفة الخامسة حسب قيمة اللوت عندك
ثم تضيف الشرط
كود PHP:
if (NewLots >= MaxLots){NewLots = FirstLots;}
سيعود للعمل بقيمة العقد الأساسي .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة turkm
أستاذنا الغالي يبدو انك لم تنتبه لسؤالي الذي في الإقتباس
هذه داله قمت بعملها ستقوم بتحويل الديسمل إلى باينري يمكنك إستخدامها
كود PHP:
int BinaryNumber(int Number)
{
int Reminder,Binary;
int i=1;
while(Number>0)
{
Reminder=Number%2;
Binary=Binary + (i*Reminder);
Number=Number/2;
i=i*10;
}
return(Binary);
}