Wal3a123
10-10-2018, 10:33 PM
السلام عليكم ورحمة الله وبركاتة
خبراء البرمجة برجاء المساعدة
الكود دا فى حالة البيع
if ((High[0] > Bid) && ((High[0] - Bid) > 7*PipValue*Point ))
بمجرد ان السعر ينزل سبع نقط فى الشمعة تتم عملية بيع
وبستخدم الكود دا فى حالة الشراء
if ((Low[0] < Ask) && ((Low[0] - Ask) > 7*PipValue*Point ))
نفس الفكرة السعر طلع سبع نقط تتم عملية الشراء
او ينتقل للشرط او الدالة اللى بعدة
السؤال هنا
اولا كود الشراء لا يعمل نهائيا
ثانيا عاوز ادخل شرط فى الكود وهو ان الحركة دى تتم فى عدد معين من الثوانى
يعنى اذا السعر تحرك سبع نقط لاسفل فى اقل من 5 ثوانى مثلا تتم عملية بيع
اية الاضافات اللى اضيفها للكود بخصوص الوقت
وهل فية طريقة افضل فى كتابة الكود والتنفيذ يكون ادق
وشكرا
kira-h
11-10-2018, 05:25 AM
وعليكم السلام
ارفق الكود كاملا للمراجعة
Wal3a123
11-10-2018, 04:58 PM
#property copyright "Copyright 2018"
#include <stdlib.mqh>
#include <WinUser32.mqh>
// exported variables
input string mm="Money management" ;
extern double Risk = 0.5;
extern int Stoploss = 4;
extern int Takeprofit = 0;
input string Trailing = "Trailing settings";
extern int TrailingStop = 1;
extern int TrailingGap = 2;
input string spread="Max spread";
extern double MaxSpread = 2;
input string time = "Hours filter";
extern int HoursFrom = 8;
extern int HoursTo = 18;
// 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 Count8 = 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()
{
PipValue = 1;
if (NDigits == 3 || NDigits == 5) PipValue = 10;
TrailingStop();
PrintInfoToChart8();
SpreadFilter9();
}
void TrailingStop()
{
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
{
double takeprofit = OrderTakeProfit();
if (OrderType() == OP_BUY && Ask - OrderOpenPrice() > TrailingStop*PipValue*Point)
{
if (OrderStopLoss() < Ask-(TrailingStop+TrailingGap)*PipValue*Point)
{
if (0 != 0) takeprofit = Ask+(0 + TrailingStop)*PipValue*Point;
bool ret1 = OrderModify(OrderTicket(), OrderOpenPrice(), Ask-TrailingStop*PipValue*Point, takeprofit, OrderExpiration(), White);
if (ret1 == false)
Print("OrderModify() error - ", ErrorDescription(GetLastError()));
}
}
if (OrderType() == OP_SELL && OrderOpenPrice() - Bid > TrailingStop*PipValue*Point)
{
if (OrderStopLoss() > Bid+(TrailingStop+TrailingGap)*PipValue*Point)
{
if (0 != 0) takeprofit = Bid-(0 + TrailingStop)*PipValue*Point;
bool ret2 = OrderModify(OrderTicket(), OrderOpenPrice(), Bid+TrailingStop*PipValue*Point, takeprofit, OrderExpiration(), White);
if (ret2 == false)
Print("OrderModify() error - ", ErrorDescription(GetLastError()));
}
}
}
}
else
Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
}
void PrintInfoToChart8()
{
string temp = "Best scalper v.2\nExecuted : " + Count8 + "\n"
+ "Spread: " + DoubleToStr(MarketInfo(Symbol(), MODE_SPREAD)/PipValue, 2)+ "\n"
+ "------------------------------------------------\n"
+ "ACCOUNT INFORMATION:\n"
+ "\n"
+ "Account Name: " + AccountName()+ "\n"
+ "Account Leverage: " + DoubleToStr(AccountLeverage(), 0)+ "\n"
+ "Account Balance: " + DoubleToStr(AccountBalance(), 2)+ "\n"
+ "Account Equity: " + DoubleToStr(AccountEquity(), 2)+ "\n"
+ "Free Margin: " + DoubleToStr(AccountFreeMargin(), 2)+ "\n"
+ "Used Margin: " + DoubleToStr(AccountMargin(), 2)+ "\n"
+ "------------------------------------------------\n";
Comment(temp);
Count8++;
}
void SpreadFilter9()
{
if ((Ask-Bid) / Point / PipValue < MaxSpread)
{
HoursFilter23();
}
}
void HoursFilter23()
{
int datetime800 = TimeLocal();
int hour0 = TimeHour(datetime800);
if ((HoursFrom < HoursTo && hour0 >= HoursFrom && hour0 < HoursTo) ||
(HoursFrom > HoursTo && (hour0 < HoursTo || hour0 >= HoursFrom)))
{
TechnicalAnalysis26();
TechnicalAnalysis27();
}
}
void TechnicalAnalysis26()
{
if ((High[0] > Bid) && ((High[0] - Bid) > 7*PipValue*Point ))
{
IfOrderDoesNotExist13();
}
}
void IfOrderDoesNotExist13()
{
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)
{
SellOrderRiskFixed12();
}
}
void SellOrderRiskFixed12()
{
double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE) / AccountLeverage();
double pipsize = 1 * 10;
double maxlots = AccountBalance() / 100 * Risk / lotsize * pipsize;
if (Stoploss == 0) Print("OrderSend() error - stoploss can not be zero");
double lots = maxlots / Stoploss * 10;
// calculate lot size based on current risk
double lotvalue = 0.001;
double minilot = MarketInfo(Symbol(), MODE_MINLOT);
int powerscount = 0;
while (minilot < 1)
{
minilot = minilot * MathPow(10, powerscount);
powerscount++;
}
lotvalue = NormalizeDouble(lots, powerscount - 1);
if (lotvalue < MarketInfo(Symbol(), MODE_MINLOT)) // make sure lot is not smaller than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MINLOT);
}
if (lotvalue > MarketInfo(Symbol(), MODE_MAXLOT)) // make sure lot is not greater than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MAXLOT);
}
double SL = Bid + Stoploss*PipValue*Point;
if (Stoploss == 0) SL = 0;
double TP = Bid - Takeprofit*PipValue*Point;
if (Takeprofit == 0) TP = 0;
int ticket = -1;
if (true)
ticket = OrderSend(Symbol(), OP_SELL, lotvalue, Bid, 3, 0, 0, "My Expert", 1, 0, Red);
else
ticket = OrderSend(Symbol(), OP_SELL, lotvalue, Bid, 3, SL, TP, "My Expert", 1, 0, Red);
if (ticket > -1)
{
if (true)
{
bool sel = 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()));
}
}
void TechnicalAnalysis27()
{
if ((Low[0] < Ask) && ((Low[0] - Ask) > 7*PipValue*Point ))
{
IfOrderDoesNotExist16();
}
}
void IfOrderDoesNotExist16()
{
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() == 1)
{
exists = true;
}
}
else
{
Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
}
if (exists == false)
{
BuyOrderRiskFixed15();
}
}
void BuyOrderRiskFixed15()
{
double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE) / AccountLeverage();
double pipsize = 1 * 10;
double maxlots = AccountBalance() / 100 * Risk / lotsize * pipsize;
if (Stoploss == 0) Print("OrderSend() error - stoploss can not be zero");
double lots = maxlots / Stoploss * 10;
// calculate lot size based on current risk
double lotvalue = 0.001;
double minilot = MarketInfo(Symbol(), MODE_MINLOT);
int powerscount = 0;
while (minilot < 1)
{
minilot = minilot * MathPow(10, powerscount);
powerscount++;
}
lotvalue = NormalizeDouble(lots, powerscount - 1);
if (lotvalue < MarketInfo(Symbol(), MODE_MINLOT)) // make sure lot is not smaller than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MINLOT);
}
if (lotvalue > MarketInfo(Symbol(), MODE_MAXLOT)) // make sure lot is not greater than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MAXLOT);
}
double SL = Ask - Stoploss*PipValue*Point;
if (Stoploss == 0) SL = 0;
double TP = Ask + Takeprofit*PipValue*Point;
if (Takeprofit == 0) TP = 0;
int ticket = -1;
if (true)
ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 3, 0, 0, "My Expert", 1, 0, Blue);
else
ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 3, SL, TP, "My Expert", 1, 0, Blue);
if (ticket > -1)
{
if (true)
{
bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
if (ret == false)
Print("OrderModify() error - ", ErrorDescription(GetLastError()));
}
}
else
{
Print("OrderSend() error - ", ErrorDescription(GetLastError()));
}
}
int deinit()
{
if (false) ObjectsDeleteAll();
}
تمام حضرتك
حضرتك كل اللى انا عاوزة
اذا اتحرك السعر سبع نقط لاعلى فى خمس ثوانى يفتح شراء
واذا تحرك السعر سبع نقط لاسفل فى خمس ثوانى يفتح بيع
زى ما حضرتك شايف انا مش قادر اجيب الكود بالظبط
فارتجلت واشتغلت على الشموع وطبعا طريقة الكود مش سليمة
لانها غير جامعة
اتمنى حضرتك تساعدنى ولك منى كل التقدير استاذى الكريم
Wal3a123
11-10-2018, 08:10 PM
الله يبارك فيك ويجعل ذلك فى ميزان حسناتك الف شكر
Wal3a123
11-10-2018, 08:13 PM
السلام عليكم
اية رأى حضرتك اغير متغير الBid
الى Ask فى حالة الشراء
ولكم جزيل الشكر
Wal3a123
11-10-2018, 08:16 PM
ايوة فندم جزالك الله كل خير
شروط الشراء هعكسها بالكامل لان شرط البيع هو شرط الشراء
وبجد كود احترافى كان صعب على مبرمج صغير مثلى يكتبة
وبحثت كتير وجبت دوال كتير لكن حقيقة كود حضرتك احترافى بمعنى الكلمة
يسلمووو
Wal3a123
11-10-2018, 08:20 PM
سبحان الله وبحمدة سبحان الله العظيم
Wal3a123
11-10-2018, 11:08 PM
اعذرنى ممكن رأىء حضرتك فى التعديل
فقط عدلت متغير ال Bid
الى Ask فى حالة الشراء
طبعا الكود سليم مليون فى المية فى حالة الشراء والبيع ومش انا اللى هقول حضرتك بجد استاذ
لكن اعتقد نتائج الباك تيست غير سليمة لانة اكسيبرت متعلق بوقت مع حركة النقط فى نطاق ضيق
مرفق التعديل
كمان دخلت عدد الثوانى وعدد النقاط كمدخلات للمستخدم
بارك الله فيك
Wal3a123
12-10-2018, 02:16 PM
الف مليون شكر يا استاذى الفاضل kira-h (https://www.fxprg.com/vb/member.php?u=120435)
الاكسيبرت فتح صفقة وبالفعل تقريبا نفس الشروط ومحقق 10% بفضل الله امس
(https://www.fxprg.com/vb/member.php?u=120435)لكن هوسى كمحب للبرمجة جعلنى الغى عامل الوقت واخلى يفتح على نقطة فقط وذلك للتجربة
ولكنة لم يستجيب
ما قصرت اخى الفاضل
لى طلب فقط تكتب لى تعليق على كل سطر فى دالة شرط البيع او الشراء
الحقيقة انا عارف انى مثقل عليك
لكنى طالب علم
وما قصرت فى كل الاحوال
kira-h
12-10-2018, 05:39 PM
العفو
الشرح كالتالي :
void TechnicalAnalysis26()
{
if(BID==0)BID=Bid;//حفظ سعر البيد إذا كان غير محفوظ
if(TIMES==0)TIMES=TimeCurrent();//حفظ التوقيت الحالي إذا كان غير محفوظ
if((Bid>=BID+points*PipValue*Point&&TimeCurrent()<TIMES+sec)
||(Bid<BID+points*PipValue*Point&&TimeCurrent()>=TIMES+sec)){BID=0;TIMES=0;}//في حال اختل أحد الشرط مثلا حقق شرط التوقيت ولم يحقق المسافة او العكس يتم الغاء ما تم حفظه
if(BID>0&&TIMES>0&&Bid>=BID+points*PipValue*Point&&TimeCurrent()>=TIMES+sec)//إذا تحققت الشروط كاملة يتم فتح الصفقة
{
IfOrderDoesNotExist13();
BID=0;TIMES=0;//عند فتح الصفقة يتم الغاء الحفظ
}
}
// وهكذا عند كل الغاء للحفظ يبدأ بحقظ قيم جديدة للسعر والتوقيت
//وطبعا شروط الشراء منفصلة تماما عن البيع وكذا القيم المحفوظة
Wal3a123
12-10-2018, 06:01 PM
الف شكرا يا فندم
سطر تنفيذ الامر
if(ASK>0&&TIMEB>0&&Ask<=ASK-points*PipValue*Point&&
TimeCurrent()>=TIMEB+sec)
فى حالة الشراء ASK>0
هل فى حالة البيع BID<0
ومش المفروض يكون ASK=0 وال TIMEB=0 لكى يكون الشرط سليم لفتح الصفقة
اعذرنى انى جاهل بس ذلك الجذء لم افهمة وهو الجذء الوحيد اللى مش فهمة