رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة zzeyani
هل يوجد حل لهاده المشكلة يا أخي . هو فعلا يصل إلى أكبر حد مسموح به من المضاعفات
قم بتقسيم حجم اللوت على أكثر من صفقه
مثال
كود PHP:
while(LOT>0)
{
if(LOT>MarketInfo(Symbol(),MODE_MAXLOT))
newLot=MarketInfo(Symbol(),MODE_MAXLOT);
else newLot=LOT;
OrderSend(Symbol(),OP_BUY,newLot,Ask,3,SL,TP,"EA",MagicNumber,0,Blue);
LOT-=MarketInfo(Symbol(),MODE_MAXLOT);
}
المتغير LOT هو حجم لوت الصفقه
رد:موضوع مخصص للأسئلة البرمجية
السلام عليكم أستاذ اسامه
ما الخطأ في هذه الأكواد لأني أريد أن يتم إغلاق صفقات البيع و الشراء عند ملامسة السعر لخط منتصف الفبولنجر
عرفت منتصف البولنجر
كود:
// double bm= iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_MAIN,0);
double bm= iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0) ;
ووضعت الشرطين داخل الداله ستارت
كود:
if (orderstotal(OP_BUY)==1 && Close[0]==bm) { CloseBuyOrders() ; }
if (orderstotal(OP_SELL)==1 && Close[0]==bm) { CloseSellOrders() ; }
و دوال أغلاق صفقة البيع و الشراء
كود:
void CloseBuyOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,digits),3*Q);
}
}
}
}
void CloseSellOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,digits),3*Q);
}
}
}
}
و دالة تعود بعدد الصفقات بنوع الصفقه
كود:
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()&& type== OrderType()){
cnt++;
}
}
return(cnt);
}
و لكن لا يتم إغلاق الصفقه عند منتصف البولنجر و قد تغلق متأخر أو لا و استخدمت سعر البيد و الآسك و نفس المشكله ..
جزاك الله كل خير
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
السلام عليكم أستاذ اسامه
ما الخطأ في هذه الأكواد لأني أريد أن يتم إغلاق صفقات البيع و الشراء عند ملامسة السعر لخط منتصف الفبولنجر
عرفت منتصف البولنجر
كود:
// double bm= iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_MAIN,0);
double bm= iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0) ;
ووضعت الشرطين داخل الداله ستارت
كود:
if (orderstotal(OP_BUY)==1 && Close[0]==bm) { CloseBuyOrders() ; }
if (orderstotal(OP_SELL)==1 && Close[0]==bm) { CloseSellOrders() ; }
و دوال أغلاق صفقة البيع و الشراء
كود:
void CloseBuyOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,digits),3*Q);
}
}
}
}
void CloseSellOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol())
{
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,digits),3*Q);
}
}
}
}
و دالة تعود بعدد الصفقات بنوع الصفقه
كود:
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()&& type== OrderType()){
cnt++;
}
}
return(cnt);
}
و لكن لا يتم إغلاق الصفقه عند منتصف البولنجر و قد تغلق متأخر أو لا و استخدمت سعر البيد و الآسك و نفس المشكله ..
جزاك الله كل خير
يجب أن تجعل الشرط إللي في إستارت >= أو <= لإن == قد لا تتحقق أبدا خصوصا على منصات 5 أرقام
كود PHP:
if (orderstotal(OP_BUY)>0 && Close[0]<=bm) { CloseBuyOrders() ; }
if (orderstotal(OP_SELL)>0 && Close[0]>=bm) { CloseSellOrders() ; }
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة xcv114
يجب أن تجعل الشرط إللي في إستارت >= أو <= لإن == قد لا تتحقق أبدا خصوصا على منصات 5 أرقام
كود PHP:
if (orderstotal(OP_BUY)>0 && Close[0]<=bm) { CloseBuyOrders() ; }
if (orderstotal(OP_SELL)>0 && Close[0]>=bm) { CloseSellOrders() ; }
تمام أخي يوسف ... جزاك الله كل خير أنت و استاذنا الكبير أسامه و كل من يساعد .
رد:موضوع مخصص للأسئلة البرمجية
الأخ العزيز الاستاذ الفاضل أسامة ( مستر دولار ) بعد أطيب التحية لشخصكم الكريم ،،،
أرجو التكرم بحل مشكلتي التالية :
عندي اكسبرت تقوم فكرته على المضاعفات والعمل على زوج عملة واحده فقط ولكني لا أستطيع التعديل عليه لأنه مغلق الكود ex4 قمت بالتفكير في كيفية وضع حد أقصى للمضاعفات التي يقوم بالدخول عليها وجاءت فكرتي كالتالي
عمل اكسبرت أخر ووضعة على شارت أخر لنفس العملة بحيث اضع في المتغيرات الخارجية له الحد الأقصى للوت المضاعفات ومن ثم هو يقوم بقراءة الاوامر المفتوحة من قبل الاكسبرت الأخر والبحث ان كان اللوت المفتوح اكبر من او يساوي الحد الاقصى الموضوع من قبل الاكسبرت التاني وان كان كذلك يقوم باغلاق جميع الصفقات المفتوحة والمعلقة على الشارت وقمت بالفعل بكتابة الأكواد التالية :
وهذا متغير خارجي للحد الاقصى للوت المطلوب اغلاق جميع صفقات المنصة عند الوصول له
كود PHP:
extern double MaxLots=2.56;
ما تم كتابتة داخل الدالة ستارت
كود PHP:
int start()
{
if ( LastOrderLots()>=MaxLots && AccountProfit()>0){while(orderstotal()>0){CloseAllOrders();}}
return(0);
}
تعريف دالة خارج دالة ستارات لاغلاق جميع الصفقات الموجودة على المنصة ( معلقة + مفتوحة )
كود PHP:
int CloseAllOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3*D);
}
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3*D);
}
if (OrderType()==OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_BUYLIMIT)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLLIMIT)
{
OrderDelete(OrderTicket());
}
}
return(0);
}
وهذه دالة خارج ستارت لتعود لنا بقيمة اللوت للصفقات المفتوحة
كود PHP:
double LastOrderLots()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
return(OrderLots());
}
}
return(0);
}
أرجو التكرم بالنظر في هذه الأكواد لاني بعد كتابتها الاكسبرت لا يتعامل ولا ينظر نهائيا للوت المفتوح على المنصة
وفكرتي استاذ اسامة باختصار عمل اكسبرت يقوم بقراءة اللوت للصفقات المفتوحة على المنصة فان كان اللوت لأحد هذه الصفقات تساوت او اكبر من MaxLots فأنه يقوم بإغلاق جميع الصفقات المفتوحة والمعلقة على المنصة بشرط صافي ربح الصفقات المفتوحة اكبر من الصفر
تقبل تحياتي
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة waleedgadelmola
الأخ العزيز الاستاذ الفاضل أسامة ( مستر دولار ) بعد أطيب التحية لشخصكم الكريم ،،،
أرجو التكرم بحل مشكلتي التالية :
عندي اكسبرت تقوم فكرته على المضاعفات والعمل على زوج عملة واحده فقط ولكني لا أستطيع التعديل عليه لأنه مغلق الكود ex4 قمت بالتفكير في كيفية وضع حد أقصى للمضاعفات التي يقوم بالدخول عليها وجاءت فكرتي كالتالي
عمل اكسبرت أخر ووضعة على شارت أخر لنفس العملة بحيث اضع في المتغيرات الخارجية له الحد الأقصى للوت المضاعفات ومن ثم هو يقوم بقراءة الاوامر المفتوحة من قبل الاكسبرت الأخر والبحث ان كان اللوت المفتوح اكبر من او يساوي الحد الاقصى الموضوع من قبل الاكسبرت التاني وان كان كذلك يقوم باغلاق جميع الصفقات المفتوحة والمعلقة على الشارت وقمت بالفعل بكتابة الأكواد التالية :
وهذا متغير خارجي للحد الاقصى للوت المطلوب اغلاق جميع صفقات المنصة عند الوصول له
كود PHP:
extern double MaxLots=2.56;
ما تم كتابتة داخل الدالة ستارت
كود PHP:
int start()
{
if ( LastOrderLots()>=MaxLots && AccountProfit()>0){while(orderstotal()>0){CloseAllOrders();}}
return(0);
}
تعريف دالة خارج دالة ستارات لاغلاق جميع الصفقات الموجودة على المنصة ( معلقة + مفتوحة )
كود PHP:
int CloseAllOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3*D);
}
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3*D);
}
if (OrderType()==OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_BUYLIMIT)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLLIMIT)
{
OrderDelete(OrderTicket());
}
}
return(0);
}
وهذه دالة خارج ستارت لتعود لنا بقيمة اللوت للصفقات المفتوحة
كود PHP:
double LastOrderLots()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
return(OrderLots());
}
}
return(0);
}
أرجو التكرم بالنظر في هذه الأكواد لاني بعد كتابتها الاكسبرت لا يتعامل ولا ينظر نهائيا للوت المفتوح على المنصة
وفكرتي استاذ اسامة باختصار عمل اكسبرت يقوم بقراءة اللوت للصفقات المفتوحة على المنصة فان كان اللوت لأحد هذه الصفقات تساوت او اكبر من MaxLots فأنه يقوم بإغلاق جميع الصفقات المفتوحة والمعلقة على المنصة بشرط صافي ربح الصفقات المفتوحة اكبر من الصفر
تقبل تحياتي
بعد إذن أستاذ أسامة
----------------------
يمكنك أن تكتفي بحلقة واحدة في دالة إستارت تقوم بالبحث ومعها دالة الإغلاق
كود PHP:
int start()
{
if(OrdersTotal()>0&&AccountProfit()>0){
for(int i=0;i<=OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderLots()>=MaxLots){
CloseAllOrders();
}
}
}
return(0);
}
رد:موضوع مخصص للأسئلة البرمجية
بس سؤال أخي xcv114
هل دالة اغلاق الصفقات خارج الدالة ستارت أقوم بتعريفها كـ Void ام int
انا قمت بتعريفها كالتالي
كود PHP:
void CloseAllOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3*D);
}
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3*D);
}
if (OrderType()==OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_BUYLIMIT)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLLIMIT)
{
OrderDelete(OrderTicket());
}
}
return(0);
}
بانتظار الرد
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة waleedgadelmola
بس سؤال أخي xcv114
هل دالة اغلاق الصفقات خارج الدالة ستارت أقوم بتعريفها كـ Void ام int
انا قمت بتعريفها كالتالي
كود PHP:
void CloseAllOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3*D);
}
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3*D);
}
if (OrderType()==OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_BUYLIMIT)
{
OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLLIMIT)
{
OrderDelete(OrderTicket());
}
}
return(0);
}
بانتظار الرد
نعم أخي void هي الصحيحة وذلك لإن الدالة لا تعود بأي ناتج
int تعني أن الدالة ستعود برقم صحيح
double تعني أن الدالة ستعود برقم عشري
string تعني أن الدالة ستعود بنص
ويمكنك تخفيف الدالة لتكون أسرع بالشكل ده
كود PHP:
void CloseAllOrders()
{
for (int cnt = 0 ; cnt < OrdersTotal() ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3*D);
}
if (OrderType()==OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3*D);
}
if (OrderType()>1)
{
OrderDelete(OrderTicket());
}
}
return(0);
}
أكبر من 1 تعني كل انواع الأوامر المعلقة
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة daod
السلام عليكم ورحمه الله وبركاته
اريد اعرف كيف سيكون اكسبيرت فكرتي هذه؟
الفكره بسيطه جدا ولكن تحتاج شويه تركيز وزادكم الله تركيز فوق تركيزكم!
مع الافتتاح لشمعه اليوم اقوم بوضع ثلاثه اوامر معلقه فوق الافتتاح اليومي من نوع باي ستوب ولكن يكون الاول على بعد 20 نقطه
والثاني على بعد 40 نقطه والثالث على بعد 60 نقطه
وهكذا ان اردت اضافه المزيد من الاوامر المعلقه وتكون الخساره لكل منهم 20 نقطه فقط والربح لكل منهم 40 نقطه.
اهم شي عندي هو في حاله ان احد هذه الاوامر المعلقه تفعل و ضرب الربح اوالخساره ان يقوم الاكسبيرت بوضع امر معلق من جديد
بنفس موضع اومكان الذي تفعل او بمعنى اصح هو اعادة الامر الذي اغلق سواء على ربح اوخساره اعادته من جديد.
مثال للتوضيح مثلا تفعل الامر الذي على بعد 40 نقطه ثم ضرب الخساره يعني اغلق على خساره في هذه الحاله يقوم الاكسبيرت
بوضع امر معلق اخر من نوع سل ليميت بنفس مكان الامر
الاول وهو 40 نقطه من افتتاح شمعة اليوم ولكن اذا افترضنا انه اغلق الامر على ربح فسوف يقوم الاكبسيرت بفتح امر معلق من نوع باي
ليميت بنفس مكان الامر المعلق الاول.
ونفس الفكره تماما في حاله وضع اوامر معلقه من نوع سل ستوب تحت الافتتاح اليومي اي على بعد 20 و40و 60 نقطه وهكذا.
ان شاء الله وضحت الفكره
وعليكم السلام ورحمة الله وبركاته
مثال راجع كود الإكسبرت المرفق سوف تجد به كل الكود الذي تريده وإذا لم تستطع فهم جزء أخبرني به
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة wadi2012
دالة
ordercloseby()
حسب ما فهمت من الوظيفة فهي تغلقة صفقة عن طريقة صفقة معاكسة لها من نفس الزوج ولكن الفراق يكون على الصفقة التي تغلق يعني
فتحت عقد 1 لوت على زوج يورو دولار شراء وعندي 1 لوت على نفس الزوج ولكن بيع
اذا اغلقت الصفقتين يدويا وكان مجموع الاغلاق يساوي -20 ولكن عند الاغلاق بالدالة السابقة يقل مجموع المحصلة فيكون 10- وسؤالي هو اذا كانت هذه الطريقة توفر نسبة خسارة فما هو العائد على البروكير او كيف يسمح البروكير بتنفيذ هذا الامر ؟؟؟
ام هي تنفع مع بروكير ecn ؟
حاليا أغلب البروكرات لا تسمح بإستخدام هذه الميزه وهي في الأساس كانت موجوده في نفس النافذة التي تقوم بفتح الصفقه منها سوف تجد خيار CloseBy إذا كان البروكر يسمح بهذه الميزه وبالتأكيد هي لن تفسد إلا إذا كان لديك صفقتين عكسيتين تريد إغلاقهم وليس شرط أن يكون حجم اللوت متساوي من الممكن أن يكون لديك صفقة بحجم لوت أكبر من الأخرى .
أما ما الفائده التي ستعود على البروكر لا يوجد فائده حسب علمي وبالتالي سوف تجد أغلب البروكرات قامت بإلغاء هذه الخاصيه