رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة imaddine1986
السلام عليكم
ممكن شرح لطريقة عمل اكسبيرت مضاعفات
فقد قمت ببرمجت اكسبيرت على شارة الرينكو
فكرته بسيطة يفتح صفقة شراء مثلا ولا يخرج منها
الا عند اغلاق شمعة نازلة ويدخل مباشرة بيع
ما ارده هو دالة تقوم بمراقبة الصفقة اول ما تاتي اشارة
عكسية فلو كانت الصفقة رابحة يغلقها ويدخل من جديد
لو كانت خاسرة اي اوقات التذبذب يحافظ عليها ويدخل بصفقة
عكسية +1 لوت ويستمر لو كانت شمعة عكسية يراقب لو
كان مجموع الصفقتين خسارة يحافظ عليهما ويدخل بلوت +1
مع الشمعة العكسية اي في نفس انتجاهها ولا يخرج حتى
يكون مجموع الصفقات موجب عند الاشارة العكسية
المضاعفات تكون 1 2 3 4 5 6 7 8 9
فقد بحث على موضوع تعليمي للمضاعفات لكن لم اجد للاسف
وعليكم السلام ورحمة الله وبركاته
أولا ستقوم بعمل دالة لحساب الربح الحالي للصفقات المفتوحه
كود PHP:
double ProfitOrders()
{
double profit;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
profit+=OrderProfit();
}
}
return(profit);
}
بحيث أقارن هل الربح الحالي مكسب أو خساره
وداله لمعرفة حجم لوت آخر صفقه ليفتح المضاعفه
كود PHP:
double LastOrderLots()
{
double profit;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
return(OrderLots());
}
}
return(0);
}
ودالة لمعرفة نوع آخر صفقه بحيث لن أفتح صفقه أخرى إلا إذا كانت صفقه عكسيه
كود PHP:
int LastOrderType()
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
return(OrderType());
}
}
return(0);
}
ودالة لإغلاق الصفقات المفتوحه
كود PHP:
void CloseOrders()
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,3);
if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
}
ثم سأضع الشروط
كود PHP:
if(/*Open Buy Order*/&&LastOrderType()==OP_SELL)
{
if(ProfitOrders()>0)
{
CloseOrders();
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
else
{
newlot=LastOrderLots()+Lots;
OrderSend(Symbol(),OP_BUY,newlot,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
وعليكم السلام ورحمة الله وبركاته
بداية البحث يجب أن تكون من i=0 حتى i أكبر من فقط وليس أكبر من أو تساوي
لأن عدد الصفقات المغلقه مثلا لو كانت 5 صفقات فأرقامها تكون من 0 إلى 4
بالنسبه للشرط فسيكون صحيح لكن ستواجهك مشكله لنفرض أن الصفقات أغلقت وأردت أن تبدأ سلسله جديده
فمجرد أن تفتح صفقه لتبدأ سلسله جديده ستجد أن الشرط قد تحقق أيضا وستغلق الصفقه مباشره
لذلك ستحتاج عمل دالة نفس الداله السابقه لكن مع إضافة شرط لتحديد الصفقه التي أغلقت بناء على الوقت أيضا كمثال
شكرا أستاذي .. نسيت أن 0 تعتبر اول صفقه مغلقة
بالنسبه للشرط هل من الممكن أن يكون هكذا
كود PHP:
if (firstclosed()=="lost" || firstclosed()=="profit" && orderscnt(OP_BUY)+orderscnt(OP_SELL)>1 && Time0!=Time[0]) { CloseOrders();}
أم أضيف إلى شروط الداله فقط دون اضافنها للشروط؟؟ هكذا .
كود PHP:
string firstclosed()
{
for(int i=0;i>OrdersHistoryTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice() && Time0!=Time[0]) return("profit");
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()&& Time0!=Time[0]) return("loss");
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()&& Time0!=Time[0]) return("profit");
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()&& Time0!=Time[0]) return("loss");
}
}
return("none");
}
وجزاك الله كل خير
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
السلام عليكم أستاذي العزيز
لو تكرمت الإكسبيرت بالمرفقات يفتح شراء بعد إغلاق شمعة إيجابية أو بيع بعد إغلاق شمعة سلبية ..
إذا كانت شراء و عكس السعر بمقدار عدد نقاط Step يفتح صفقه بيع عكسيه بمضاعفات تحدد خارجيا ..
إذا عكس و صعد مره اخرى بمقدار step يفتح صفقة شراء مضاعف ايضا بنفس ستوب الشراء الأول وهدفه و هكذا و يكون دائما نفس الهدف و الإستوب لكل صفقه و هدف الشراء يكون إستوب البيع و العكس ... و هو يضع أوامر معلقه ستوب عكس الصفقه المفعله الأخيره .
المشكله التي واجهتني أنه احيانا يفوت تعليق أحد الأوامر و أعتقدت أن حسابي لنقطة الأمر المعلق بها مشكله فجعلتها من سعر الآسك للشراء المعلق و البيد للبيع المعلق بدلا من سعر إفتتاح آخر صفقه و لكن واجهتني مشكله أخرى عدم إغلاق الصفقات البيع و الشراء سويا رغم وضعي شرط لذلك فلا يتم مسح الأوامر و يوثر على الشروط ..
ففضلا رجاء الإطلاع و غفادتي بالأخطاء أو الحلول .
و جزاك الله كل خير
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
السلام عليكم أستاذي العزيز
لو تكرمت الإكسبيرت بالمرفقات يفتح شراء بعد إغلاق شمعة إيجابية أو بيع بعد إغلاق شمعة سلبية ..
إذا كانت شراء و عكس السعر بمقدار عدد نقاط Step يفتح صفقه بيع عكسيه بمضاعفات تحدد خارجيا ..
إذا عكس و صعد مره اخرى بمقدار step يفتح صفقة شراء مضاعف ايضا بنفس ستوب الشراء الأول وهدفه و هكذا و يكون دائما نفس الهدف و الإستوب لكل صفقه و هدف الشراء يكون إستوب البيع و العكس ... و هو يضع أوامر معلقه ستوب عكس الصفقه المفعله الأخيره .
المشكله التي واجهتني أنه احيانا يفوت تعليق أحد الأوامر و أعتقدت أن حسابي لنقطة الأمر المعلق بها مشكله فجعلتها من سعر الآسك للشراء المعلق و البيد للبيع المعلق بدلا من سعر إفتتاح آخر صفقه و لكن واجهتني مشكله أخرى عدم إغلاق الصفقات البيع و الشراء سويا رغم وضعي شرط لذلك فلا يتم مسح الأوامر و يوثر على الشروط ..
ففضلا رجاء الإطلاع و غفادتي بالأخطاء أو الحلول .
الإكسبيرتو جزاك الله كل خير
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
شكرا أستاذي .. نسيت أن 0 تعتبر اول صفقه مغلقة
بالنسبه للشرط هل من الممكن أن يكون هكذا
كود PHP:
if (firstclosed()=="lost" || firstclosed()=="profit" && orderscnt(OP_BUY)+orderscnt(OP_SELL)>1 && Time0!=Time[0]) { CloseOrders();}
أم أضيف إلى شروط الداله فقط دون اضافنها للشروط؟؟ هكذا .
كود PHP:
string firstclosed()
{
for(int i=0;i>OrdersHistoryTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY && OrderClosePrice()>=OrderOpenPrice() && Time0!=Time[0]) return("profit");
if(OrderType()==OP_BUY && OrderClosePrice()<=OrderOpenPrice()&& Time0!=Time[0]) return("loss");
if(OrderType()==OP_SELL && OrderClosePrice()<=OrderOpenPrice()&& Time0!=Time[0]) return("profit");
if(OrderType()==OP_SELL && OrderClosePrice()>=OrderOpenPrice()&& Time0!=Time[0]) return("loss");
}
}
return("none");
}
وجزاك الله كل خير
يوجد أيضا ملاحظة آخر بالنسبه للداله
أنت بهذه الطريقة ستقوم بمعرفة آول صفقه أغلقت على ربح أو خساره لكن الصحيح أنك ستبحث في آخر صفقه أغلقت
فسوف تبدأ البحث ب OrdersHistoryTotal والمقارنه تكون أكبر من أو تساوي 0
بالنسبه لتعديل شروط توقيت فتح الصفقه
عند فتح الصفقه الأساسيه ( أول صفقه ) إجعل
ثم ستضع في شروط الداله نفسها
كود PHP:
&&OrderOpenTime()> Time0
بالتالي ستتأكد أنك تتعامل مع الصفقة التي توقيتها أكبر من توقيت بداية السلسله الجديده
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
أستاذ أسامه كيف أجعل صفقات شراء و بيع يغلقوا مع بعضهم في نفس التوقيت إذا كان ستوب صفقات البيع هو هدف صفقات الشراء و العكس . هل أطرح قيمة السبريد من هدف صفقات الشراء فقط ؟ أم هل ممكن أجعل صفقات البيع تفتح و تغلق بسعر البيد ؟
سوف تجعل ستوب صفقات البيع = هدف صفقات الشراء + قيمة الإسبريد
وستوب صفقة الشراء = هدف صفقة البيع - الإسبريد
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
السلام عليكم أستاذي العزيز
لو تكرمت الإكسبيرت بالمرفقات يفتح شراء بعد إغلاق شمعة إيجابية أو بيع بعد إغلاق شمعة سلبية ..
إذا كانت شراء و عكس السعر بمقدار عدد نقاط Step يفتح صفقه بيع عكسيه بمضاعفات تحدد خارجيا ..
إذا عكس و صعد مره اخرى بمقدار step يفتح صفقة شراء مضاعف ايضا بنفس ستوب الشراء الأول وهدفه و هكذا و يكون دائما نفس الهدف و الإستوب لكل صفقه و هدف الشراء يكون إستوب البيع و العكس ... و هو يضع أوامر معلقه ستوب عكس الصفقه المفعله الأخيره .
المشكله التي واجهتني أنه احيانا يفوت تعليق أحد الأوامر و أعتقدت أن حسابي لنقطة الأمر المعلق بها مشكله فجعلتها من سعر الآسك للشراء المعلق و البيد للبيع المعلق بدلا من سعر إفتتاح آخر صفقه و لكن واجهتني مشكله أخرى عدم إغلاق الصفقات البيع و الشراء سويا رغم وضعي شرط لذلك فلا يتم مسح الأوامر و يوثر على الشروط ..
ففضلا رجاء الإطلاع و غفادتي بالأخطاء أو الحلول .
الإكسبيرتو جزاك الله كل خير
وعليكم السلام ورحمة الله وبركاته المشكله ليست لديك في سعر وضع الأمر المعلقه
إجعل سعر الأمر المعلق الجديد = ستوب لوز الأمر المفتوح
إلغي الشرط
وإلا في هذه الحاله لن يضع الأمر المعلق فمجرد فتح الصفقه الرئيسيه أو في حال تفعل الأمر المعلق في نفس الشمعه لأن هذا الشرط لن يتحقق إلا بعد فتح شمعه جديده بالتالي لا تحتاجه
رد:موضوع مخصص للأسئلة البرمجية
استاذ اسامة عندي مشكلة في الاكسبيرت بحيث
اول ما يبدا في المضاعفات يفتح عدد كبير من الصفقة
https://forum.arabictrader.com/t168758.html
ولم استطع تحديد عدد الصفقات داخل دالة التالية
كود PHP:
if(Cl2<Cl1&&LastOrderType()==OP_SELL)
{
if(ProfitOrders()>0)
{
CloseOrders();
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
else
{
newLot=LastOrderLots()+Lots;
OrderSend(Symbol(),OP_BUY,newLot,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
}
//////////////////////////////////////////////////
if(Cl2>Cl1&&LastOrderType()==OP_BUY)
{
if(ProfitOrders()>0)
{
CloseOrders();
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
else
{
newLot=LastOrderLots()+Lots;
OrderSend(Symbol(),OP_SELL,newLot,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
}
return(0);
}
رد:موضوع مخصص للأسئلة البرمجية
تضيف المتغير datetime T; ضمن المتغيرات في بداية الأكسبيرت ثم تضيف ضمن الشروط :
كود PHP:
if(T!=Time[0]&&Cl2<Cl1&&LastOrderType()==OP_SELL)
{
if(ProfitOrders()>0)
{
CloseOrders();
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
else
{
newLot=LastOrderLots()+Lots;
OrderSend(Symbol(),OP_BUY,newLot,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
T=Time [0];
}
//////////////////////////////////////////////////
if(T!=Time[0]&&Cl2>Cl1&&LastOrderType()==OP_BUY)
{
if(ProfitOrders()>0)
{
CloseOrders();
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
else
{
newLot=LastOrderLots()+Lots;
OrderSend(Symbol(),OP_SELL,newLot,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
T=Time [0];
}
return(0);
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة imaddine1986
استاذ اسامة عندي مشكلة في الاكسبيرت بحيث
اول ما يبدا في المضاعفات يفتح عدد كبير من الصفقة
https://forum.arabictrader.com/t168758.html
ولم استطع تحديد عدد الصفقات داخل دالة التالية
كود PHP:
if(Cl2<Cl1&&LastOrderType()==OP_SELL)
{
if(ProfitOrders()>0)
{
CloseOrders();
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
else
{
newLot=LastOrderLots()+Lots;
OrderSend(Symbol(),OP_BUY,newLot,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
}
//////////////////////////////////////////////////
if(Cl2>Cl1&&LastOrderType()==OP_BUY)
{
if(ProfitOrders()>0)
{
CloseOrders();
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
else
{
newLot=LastOrderLots()+Lots;
OrderSend(Symbol(),OP_SELL,newLot,NormalizeDouble(Ask,Digits),3,0,0,"EA",MagicNumber,0,Blue);
}
}
return(0);
}
الإضافه إلى مشاركة الأخ جميل قم أيضا بعمل دالة لمعرفة عدد الصفقات المفتوحه حسب نوع الصفقه
مثال
كود PHP:
int orderscnt(int type){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && MagicNumber==OrderMagicNumber()&&OrderType()==type){
cnt++;
}
}
}
return(cnt);
}
ثم ستضيف في شرط الشراء
كود PHP:
orderscnt(OP_BUY)==0
وفي شرط البيع
كود PHP:
orderscnt(OP_SELL)==0
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة imaddine1986
بارك الله فيكما وجعله في ميزان حسناتكم
فقد كنت في حاجة لشرح اكثر من التعديل لاني في مرحلة
التعلم واعتمد على دروس الاستاذ اسامة واعتبرها مرجع لي
الخطأ لديك في الكود أنك لم تضع حد معين بحيث عندما يفتح الصفقه لا يفتح غيرها لذلك يجب أن تضع شرط لتحديد عدد الصفقات بحيث عندما يفتح صفقة الشراء سوف نضع شرط بأن صفقات الشراء = 0 بالتالي لن يفتح صفقه جديده حتى إغلاق الصفقه القديمه وأيضا عندما يقوم بالبيع سوف يبيع مره واحده ثم عندما يقارن الشرط أن عدد صفقات البيع = 0 فلن يتحقق الشرط بالتالي لن يفتح إلا صفقه واحده