ارجع للمشاركة 4032 في الصفحة السابقة ستجد فيها الأجابة .
Printable View
وعليكم السلام ورحمة الله وبركاته
ستستخدم نفس الكود السابق لكن التعديل فقط سيكون في متغير حجم اللوت
أولا إجعل لصفقات كل إتجاه كومنت معين لأنك ستحتاجه عند تحديد حجم اللوت
فبدلا من
سوف يكونكود PHP:double newLot=LastLot()*2;
حيث أن Lots هو حجم اللوت الإبتدائيكود PHP:double newLot=LastLot()+Lots;
مثال
كود PHP:////////////////////
int orderscnt(int type)
{
int cnt;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
cnt++;
}
}
return(cnt);
}
double LastLot(string comment)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
double L=OrderLots();
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&&OrderType()==type&&OrderComment()==comment||OrderComment()=="EA")
{
return(L);
}
}
}
double LastOpenPrice(string comment)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&&OrderType()==type&&OrderComment()==comment||OrderComment()=="EA")
{
return(OrderOpenPrice());
}
}
}
ونفس الفكره بالنسبه للشراءكود PHP:if((Ask-LastOpenPrice("EALoss")>=Step*Point)&&orderscnt(OP_SELL)>0)
{
newLot=LastLot("EALoss")+Lots;
OrderSend(Symbol(),OP_SELL,newLot,NormalizeDouble(Bid,Digits),3,0,0,"EALoss",MagicNumber,0,Blue);
}
if((LastOpenPrice("EAProfit")-Ask>=Step*Point&&OpenWinMultiplier)&&orderscnt(OP_SELL)>0)
{
newLot=LastLot("EAProfit")+Lots;
OrderSend(Symbol(),OP_SELL,newLot,NormalizeDouble(Bid,Digits),3,0,0,"EAProfit",MagicNumber,0,Blue);
}
الصفقه الرئيسيه المفروض الكومنت لها سيكون بإسم EA
السلام عليكم اخ اسامه لقد وضعت ردا كما قلت لي وفي انتظارك هناك في موضوع اكسبيرت المضاعفات من اجل اضافه المناقصات .
يجب أن تحسبها بطريقة أخرى فمثلا أريد حساب اليوم بدءا من الساعه 11 وليس الساعه 0 وينتهي الساعه 3 في اليوم التالي
وهذه الفكره إستخدمتها سابقا في إكسبرت قمت ببرمجته
أولا بداية اليوم ستصبح
ونهاية اليومكود PHP:datetime TimeStart=StrToTime(TimeToStr(iTime(Symbol(),1440,1),TIME_DATE)+" "+2);
int BarStart=iBarShift(Symbol(),60,TimeStart,false);
فسوف يكون الهاي واللو والإفتتاح والإغلاقكود PHP:datetime TimeEnd=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+1);
int BarEnd=iBarShift(Symbol(),60,TimeEnd,false);
كود PHP:double highDay=High[iHighest(Symbol(),0,MODE_HIGH,BarStart-BarEnd,BarEnd)];
double lowDay=Low[iLowest(Symbol(),0,MODE_LOW,BarStart-BarEnd,BarEnd)];
double closeDay=iClose(Symbol(),60,BarEnd);
double openDay=iOpen(Symbol(),60,BarStart);
السلام عليكم ورحمه الله
تحية طيبة للجميع
هذا هو الكود المطلوب وسوف اتعلم منه الكثير
جزاك الله كل خير استاذي اسامة وزادك من فضلة وعلمه
مع تمنياتي للجميع بالتوفيق
لاتنساني من دعائك
https://forum.arabictrader.com/t37612-184.html " 184 185 188 196 197 220 221 222 223 261 262 269 "
السلام عليكم رحمة الله
لقد قمت بعمل أكسبرت على الماكد وكانت شروط الشراء عندما يكون قيمة (الماكد >السجنال ) < الصفر
وشروط البيع عندما يكون قيمة ( الماكد< السيجنال) > الصفر
وأشتغل معى الاكسبرت .
وقمت بأضافة شرط اخر للشراء عندما يكون قيمة ( الماكد > السيجنال ) > الصفر
وللبيع عندما يكون قيمة ( الماكد < السيجنال) < الصفر
لم يعمل معى بعد أضافة الشروط الجيدة
أطلب منك أخى الفاضل أسامة أن توضح لى كيف أن أكتبها وجزاك الله كل الخير
مرفق لكم الكسبرت قبل التعديل
السلام عليكم ورحمة الله وبركاته
نفترض اكسبيرت مضاعفات يعمل على أزواج مختلفة وكل زوج وصل لعدد مضاعفات معينة
الفكرة هي عند تحقق ربح مثلا 10% من الحساب أو الاكويتي يتم إغلاق كل الصفقات سواء المفتوحة أو المعلقة والبدء من جديد باللوت الابتدائي على الأزواج
مبدئيا كل زوج له اكسبيرت وكل اكسبيرت به دالة المضاعفات
قمت بحذف الماجيك نمبر ويكفي الـ Symbol يفصل العمليات لكل زوج
هل الدالة صحيحة ؟؟
كود:// exported variables
extern double Lots = 0.01;
extern double LotsMpOnLoss = 2;
double LotsMpOnProfit = 1;
extern double MaxLots = 100;
bool LotsResetOnProfit = true;
bool LotsResetOnLoss = false;
extern int ProfitRatio = 10;
شكرا جزيلا :eh_s(7): مع تمنياتي للجميع بالتوفيقكود:void TechnicalAnalysis1()
{
if (Close[1]<Open[1])
{
double profit = 0;
int cnt = OrdersHistoryTotal();
for (int i=cnt-1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
{
profit = OrderProfit();
CurrentLots = OrderLots(); // take lots from the last order
break;
}
}
if(AccountProfit()>=(ProfitRatio*AccountBalance()/100)
if(AccountProfit()>=(ProfitRatio*AccountEquity()/100)
{
CurrentLots = Lots;
}
if (profit > 0) // had profit
{
CurrentLots = CurrentLots * LotsMpOnProfit + 0;
if (LotsResetOnProfit)
CurrentLots = Lots;
}
else if (profit < 0) // had loss
{
CurrentLots = CurrentLots * LotsMpOnLoss + 0;
if (LotsResetOnLoss) CurrentLots = Lots;
}
if (CurrentLots > MaxLots)
{
CurrentLots = Lots;
}
double lotvalue = CurrentLots;
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);
}
int expire = TimeCurrent() + 60 * Expiration;
double price = (NormalizeDouble(Close[1], NDigits) - (Step*PipValue*Point));
double SL = price + Sellloss*PipValue*Point;
if (Sellloss == 0) SL = 0;
double TP = price - Sellprofit*PipValue*Point;
if (Sellprofit == 0) TP = 0;
if (Expiration == 0) expire = 0;
int Tries;
int ticket = -1;
if (ECNBroker)
{
ticket = OrderSend(Symbol(), OP_SELLSTOP, lotvalue, price, Slippage, 0, 0, "Kira-h", MagicNo, expire, Red);
if(ticket>-1 && Tries<10)
{
OrderSelect(ticket, SELECT_BY_TICKET);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Blue);
Tries++;Sleep(1000);
}
}
else
ticket = OrderSend(Symbol(), OP_SELLSTOP, lotvalue, price, Slippage, SL, TP, "Kira-h", MagicNo, expire, Red);
}
}
وعليكم السلام ورحمة الله وبركاته
لنفرض أن الإكسبرتات أغلقت على ربح والحساب الآن أصبح الربح 50% من الحساب وتم البدء بلوت جديد لكن الصفقات التاليه أغلقت على خساره فأصبح ربح الحساب 30% أي نقص في هذه الحاله الشرط
سوف يظل محقق في حين أنه المفروض سيدخل بمضاعفه لأن الصفقات أغلقت على خساره وليست على ربح فيجب أن تقوم بتعديل هذه المشكله بحيث ستحب الربح المحقق بدأ من أول صفقة جديده تم فتحها وليس الربح لكل الحسابكود PHP:if(AccountProfit()>=(ProfitRatio*AccountBalance()/100)
if(AccountProfit()>=(ProfitRatio*AccountEquity()/100)
{
CurrentLots = Lots;
}