رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
حسب ما أرى في الشارت المرفق فالصفقات أغلقت تماما على النقاط المحققه ( إذا كنت تقصد الصفقات التي عليها سهم )
فهي أغلقت على سعر إغلاق الشمعه السابقه عندما وصل السعر لها
أيضا الأفضل أن تجعل شروط الإغلاق
كود PHP:
if(Bid<buys1||Ask>SeLLsl){CloseOrders();}
حتى في حال التحرك السريع للسعر وربما عدم المرور نقاط الأستوب فقد لا يغلق الإكسبرت الصفقات عندها
قمت بتعديل الشروط ولكن مازالت المشكلة موجودة ، على كل حال انا استخدمت الدالة التى تعود بسعر إغلاق الشمعة السابقة
كود PHP:
double ClosePrice(){
for(int i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){
int bar=iBarShift(Symbol(),0,OrderOpenTime(),false); // To Find current OrderOpenTime for Bar[0] then get closeprice to the previous Bar
double ClosePrice=Close[bar+1];
}
}
return(ClosePrice);
}
وشروط الإغلاق تعمل الآن بشكل صحيح ، جزاك الله خيرا
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة ahmedessam58
مستر دولار / استاذ اسامة
الكود مظبوط وتمام بس انا مكنتش عاوز المضاعفات تضرب فى عدد صحيح وبمعنى اصح عاوز اققل المضاعفات
يعنى اضربها فى اى متغير وليكن 1.3 مثلا ولما جربت اغير النسبة اشتغلت على عقود مينى ولم عملت العقود ميكرو المضاعفات مشتغلتش
فأنا عاوز اخلى المضاعفات تشتغل مع الميكرو وشكرا
الكود
كود PHP:
//+------------------------------------------------------------------+
//| |
//| |
//| www.arabictrader.com/vb |
//| |
//| [email protected] |
//+------------------------------------------------------------------+
#property copyright "MR.dollarEA"
#property link "[email protected]"
extern bool UseTimeFilter = false;
extern int StartHour = 7;
extern int EndHour = 17;
extern string MM_Parameters = "---------- Money Management";
extern int MaxTrades = 1;
extern double Lots = 0.10;
extern string Ich=" Ichimoku Settings";
extern int tenkansen=9;
extern int kijunsen=26;
extern int senkospan=52;
extern int shift=1;
extern int shift2=26;
extern int Ichimoku_TIME_FRAME=240;
extern string S5="Order Management";
extern int BreakEven=0;
extern int movestopto=1;
extern int StopLoss=0;
extern int TakeProfit=0;
extern int TrailingStop=0;
extern int TrailingStep=0;
double point;
int digits;
double FirstLot;
extern int MagicNumber=2533;
int init()
{
FirstLot=Lots;
if(Digits<4)
{
point=0.01;
digits=2;
}
else
{
point=0.0001;
digits=4;
}
return(0);
}
//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS deinitialization function |
//+------------------------------------------------------------------+
void deinit() {
Comment("");
}
int orderstotal(){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS Start function |
//+------------------------------------------------------------------+
int start()
{
Comment("Programmed by MR.dollar"+"\n"+"منتدى المتداول العربي"+"\n"+"www.arabictrader.com/vb");
if (UseTimeFilter){
if(!((StartHour < EndHour && TimeHour(TimeCurrent()) >= StartHour && TimeHour(TimeCurrent()) < EndHour) || (StartHour > EndHour && TimeHour(TimeCurrent()) >= StartHour ||
TimeHour(TimeCurrent()) < EndHour))){
Comment("Non-Trading Hours!");
return(0);
}
}
//|---------trailing stop
if(TrailingStop>0)MoveTrailingStop();
if(BreakEven>0)MoveBreakEven();
//////////////////////////////////////////////////
double Tenkan=iIchimoku(NULL,0,tenkansen,kijunsen,senkospan,MODE_TENKANSEN,shift);
double Kijun=iIchimoku(NULL,0,tenkansen,kijunsen,senkospan,MODE_KIJUNSEN,shift);
double Senkou=iIchimoku(NULL,0,tenkansen,kijunsen,senkospan,MODE_CHINKOUSPAN,1+kijunsen);
double Senkoua=iIchimoku(NULL,0,tenkansen,kijunsen,senkospan,MODE_SENKOUSPANA,shift);
double Senkouaplus=iIchimoku(NULL,0,tenkansen,kijunsen,senkospan,MODE_SENKOUSPANA,shift+27);
double Senkoub=iIchimoku(NULL,0,tenkansen,kijunsen,senkospan,MODE_SENKOUSPANB,shift);
double Senkoubplus=iIchimoku(NULL,0,tenkansen,kijunsen,senkospan,MODE_SENKOUSPANB,shift+27);
double Ichimoku_B=iCustom(Symbol(),0,"Ichimoku Trend Magic Histogram with Alert",1,shift);
double Ichimoku_S=iCustom(Symbol(),0,"Ichimoku Trend Magic Histogram with Alert",0,shift);
double Ichimoku_BF=iCustom(Symbol(),0,"Ichimoku Bars Filter",0,shift);
double Ichimoku_SF=iCustom(Symbol(),0,"Ichimoku Bars Filter",1,shift);
double IchimoAA=iIchimoku(NULL,Ichimoku_TIME_FRAME,9,26,52,MODE_SENKOUSPANA,shift);
double IchimoBB=iIchimoku(NULL,Ichimoku_TIME_FRAME,9,26,52,MODE_SENKOUSPANB,shift);
////////////////////////////////////////////////////
double SL,TP;
////////////////////////////////
if((Open[1]>Tenkan)&&(Close[1]>Tenkan)&&(Tenkan>=Kijun)&&(Close[1]>Senkoub)&&(Close[1]>Senkoua)&&(Ichimoku_B==3)&&
(Senkou>Senkoubplus&&Senkou>Senkouaplus)&&(Ichimoku_BF>0)&&(Close[1]>IchimoAA)&&(Close[1]>IchimoBB))
{
if(orderstotal()<MaxTrades){
if(StopLoss==0){SL=0;}else{SL=Ask-StopLoss*Point;}
if(TakeProfit==0){TP=0;}else{TP=Ask+TakeProfit*Point;}
if(WinorLoss()==false)Lots=lastlot()*2;
else Lots=FirstLot;
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SL,TP,"MR.dollar EA",MagicNumber,0,Blue);
PlaySound("Alert.wav");
}
}
/////////////////////
if ((Open[1]<Tenkan)&&(Close[1]<Tenkan)&&(Tenkan<=Kijun)&&(Close[1]<Senkoua)&&(Close[1]<Senkoub)&&(Ichimoku_S==3)&&
(Senkou<Senkoubplus&&Senkou<Senkouaplus)&&(Ichimoku_SF>0)&&(Close[1]<IchimoAA)&&(Close[1]<IchimoBB))
{
if(orderstotal()<MaxTrades){
if(StopLoss==0){SL=0;}else{SL=Bid+StopLoss*Point;}
if(TakeProfit==0){TP=0;}else{TP=Bid-TakeProfit*Point;}
if(WinorLoss()==false)Lots=lastlot()*2;
else Lots=FirstLot;
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,TP,"MR.dollar EA",MagicNumber,0,Red);
PlaySound("Alert.wav");
}
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
// Limiting Orders
//+------------------------------------------------------------------+
// OrdersHistoryTotal -- MODE_HISTORY -- Closed Orders //
// OrdersTotal -- MODE_TRADES -- Opend Orders //
//+------------------------------------------------------------------+
// lastlot & WinorLoss Functions //
double lastlot(){
for(int i=0;i<OrdersHistoryTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){
double lotsnumber=OrderLots();
}
}
return(lotsnumber);
}
bool WinorLoss(){
bool win=true;
for(int i=0;i<OrdersHistoryTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()){
if(OrderProfit()>0){
win=true;
}
else{
win=false;
}
}
}
return(win);
}
//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS TrailingStop |
//+------------------------------------------------------------------+
//|---------trailing stop
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);
}
}
}
}
}
}
void MoveBreakEven()
{
int cnt,total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
if(BreakEven>0)
{
if(NormalizeDouble((Bid-OrderOpenPrice()),digits)>BreakEven*point)
{
if(NormalizeDouble((OrderStopLoss()-OrderOpenPrice()),digits)<0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+movestopto*point,digits),OrderTakeProfit(),0,Blue);
}
}
}
}
else
{
if(BreakEven>0)
{
if(NormalizeDouble((OrderOpenPrice()-Ask),digits)>BreakEven*point)
{
if(NormalizeDouble((OrderOpenPrice()-OrderStopLoss()),digits)<0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-movestopto*point,digits),OrderTakeProfit(),0,Red);
}
}
}
}
}
}
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
بالنسبه لإضافة مؤشرات بتايم فريم مختلف وعمل مؤشرات منها فهي تختلف قليلا عن الإكسبرتات
لماذا
لنفرض حاليا على شارت الساعه
ووصلت للشمعه رقم 10 وتريد حساب الشروط عندها فسوف تكون الشمعه المحدده بالخط الأحمر
الملف المرفق 333706
لكن عندما تذهب إلى فريم الأربع ساعات فأيضا رقم الشمعه سيكون 10
المحدده بالخط الأبيض
الملف المرفق 333705
لاحظ الفرق الذي حدث والخطأ وهذا نظرا لأنها عندما قام بحساب 10 شمعات على فريم الساعه في الحقيقه المفروض أن يقف عند الشمعه رقم 2 على فريم الأربع ساعات
وهذا ما قد يسبب الخطأ ونفس الخطأ على فريم اليومي أو أي فريم آخر
بالتالي الكود يجب أن يكون
كود PHP:
int shift;
double up =iCustom(NULL,0,"auto recommended",2,i+1);
double down =iCustom(NULL,0,"auto recommended",3,i+1);
double up2 =iCustom(NULL,0,"auto recommended",2,i+2);
double down2 =iCustom(NULL,0,"auto recommended",3,i+2);
double IchimoA=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANA,i+1);
double IchimoB=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANB,i+1);
shift=iBarShift(Symbol(),Ichimoku_TIME_FRAME,Time[i],false);
double IchimoAA=iIchimoku(NULL,Ichimoku_TIME_FRAME,9,26,52,MODE_SENKOUSPANA,shift+1);
double IchimoBB=iIchimoku(NULL,Ichimoku_TIME_FRAME,9,26,52,MODE_SENKOUSPANB,shift+1);
shift=iBarShift(Symbol(),Ichimoku_TIME_FRAME_2,Time[i],false);
double IchimoAAA=iIchimoku(NULL,Ichimoku_TIME_FRAME_2,9,26,52,MODE_SENKOUSPANA,shift+1);
double IchimoBBB=iIchimoku(NULL,Ichimoku_TIME_FRAME_2,9,26,52,MODE_SENKOUSPANB,shift+1);
تم التعديل وهل دالة iBarShift تستخدم دائمـا فـ حالة إستدعاء مؤشرات من فريمات مختلفة ، ولماذا لاتظهر هذه المشكلة فـ الاكسيبرت مع إنها نفس الفكرة
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
استاذ اسامة ، انا قمت بعمل اكسيبرت للمؤشر المرفق ، والشروط صحيحة لفتح الصفقات فـ الباك تست ، ولكن الغريب ان إشارة المؤشر تظهر مرة واحدة عند بداية الباك تست ولاتظهر بعد ذلك على الشارت اثناء عمل الاكسيبرت !!
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة Moath Mohammed
أتمنى من الغالين ( الأستاذ أسامة ، المهندس يوسف ) توضيح كيفية عمل هذه الدالة
اقتباس:
المشاركة الأصلية كتبت بواسطة xcv114
ستقوم بعمل دالة تأتي بعدد الأوردرات المفتوحة
كود PHP:
int orderstotal(int type){
int cnt=0;
for(int i =0;i<=OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber() && OrderType()==type){
cnt++;
}
}
return(cnt);
}
ثم تقوم بعمل دالة أخرى تأتي بسعر فتح الأوردر الأول
كود PHP:
double FirstOrderPrice(int type)
{
for (int i=0;i<=OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && OrderType()==type)
{
return(OrderOpenPrice());
}
}
return(0);
}
ثم تقوم بعمل دالة أخرى لتعديل التيك بروفت
كود PHP:
void ModifyTP(int type)
{
for (int cnt = OrdersTotal() ; cnt >=0 ; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
double tp=OrderTakeProfit();int ticket=OrderTicket();
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() &&OrderType()==type)
{
if(tp!=FirstOrderPrice(type))
OrderModify(ticket,OrderOpenPrice(),OrderStopLoss(),FirstOrderPrice(type),0);
}
}
}
ثم تضيف الأكواد دي في دالة start
كود PHP:
if(orderstotal(OP_BUY)>1){ModifyTP(OP_BUY);}
if(orderstotal(OP_SELL)>1){ModifyTP(OP_SELL);}
وبالتالي لو كانت عمليات الشراء أكبر من 1 سيقوم بتعديل التيك بروفت لكل العمليات لسعر إفتتاح أول عملية شراء
ولو عمليات البيع أكبر من 1 سيقوم بتعديل التيك بروفت لسعر إفتتاح أول عملية بيع
كان الأفضل يا أخي إنك ترفق الكود وإحنا نعدل لك عليه
نفس الشرح إللي فوق ده ممكن تستخدمه بس هتغير بس هنزود دالة لمعرفة أخر تيك بروفت وهنغير في الأكواد إللي في دالة start()
دالة لمعرفة أخر تيك بروفت
كود PHP:
double GetlastTP(int type)
{
for (int i=OrdersTotal();i>0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && OrderType()==type)
{
return(OrderTakeProfit());
}
}
return(0);
}
والأكواد إللي في إستارت ستصع بدل منها
كود PHP:
if(orderstotal(OP_BUY)>1 && orderstotal(OP_BUY)<3){ModifyTP(OP_BUY);}
if(orderstotal(OP_BUY)>=3){
for (int i=OrdersTotal();i>0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderTakeProfit()!=GetlastTP(OP_BUY) && OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_BUY){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),GetlastTP(OP_BUY),0);
}
}
if(orderstotal(OP_SELL)>1 && orderstotal(OP_SELL)<3){ModifyTP(OP_SELL);}
if(orderstotal(OP_SELL)>=3){
for (int i=OrdersTotal();i>0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderTakeProfit()!=GetlastTP(OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_SELL){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),GetlastTP(OP_SELL),0);
}
}
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة xcv114
كان الأفضل يا أخي إنك ترفق الكود وإحنا نعدل لك عليه
نفس الشرح إللي فوق ده ممكن تستخدمه بس هتغير بس هنزود دالة لمعرفة أخر تيك بروفت وهنغير في الأكواد إللي في دالة start()
دالة لمعرفة أخر تيك بروفت
كود PHP:
double GetlastTP(int type)
{
for (int i=OrdersTotal();i>0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && OrderType()==type)
{
return(OrderTakeProfit());
}
}
return(0);
}
والأكواد إللي في إستارت ستصع بدل منها
كود PHP:
if(orderstotal(OP_BUY)>1 && orderstotal(OP_BUY)<3){ModifyTP(OP_BUY);}
if(orderstotal(OP_BUY)>=3){
for (int i=OrdersTotal();i>0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderTakeProfit()!=GetlastTP(OP_BUY) && OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_BUY){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),GetlastTP(OP_BUY),0);
}
}
if(orderstotal(OP_SELL)>1 && orderstotal(OP_SELL)<3){ModifyTP(OP_SELL);}
if(orderstotal(OP_SELL)>=3){
for (int i=OrdersTotal();i>0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderTakeProfit()!=GetlastTP(OP_SELL) && OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && OrderType()==OP_SELL){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),GetlastTP(OP_SELL),0);
}
}
تفضل يالغالي شوف المرفقات
وأعرف انه مليان أخطاء بس نحاول نتعلم :no3:
< مبتديء متطفل