رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
وعليكم السلام ورحمة الله وبركاته
أولا بداخل الداله init
كود PHP:
int digits;
int init(){
if(Digits>3){
digits=4;
}
else {
digits=2;
}
}
ثم داخل الداله start
الفكره في أني أريد أن أحذف الرقم العشري الخامس حتى لا يدخل في المقارنه
كود PHP:
string pr=DoubleToStr(Bid,Digits);
double bid=StrToDouble(StringSubstr(pr,0,digits));
if (bid > price)// نفذ
if (bid < price)// نفذ
price=bid;
متشكر يا أستاذ أسامة
لكن ماشتغلش الكود كده واعتقد إن بدل المتغير pr لازم نعمله price أو بدل price نعملها pr صح
لما عدلتها بالشكل ده
كود PHP:
double price;
int digits;
int u;
int d;
//----------------------------------------------------------
int init()
{
if(Digits>3){
digits=4;
}
else {
digits=2;
}
return(0);
}
//----------------------------------------------------------
int start()
{
string price=DoubleToStr(Bid,Digits);
double bid=StrToDouble(StringSubstr(price,0,digits));
if (bid > price)u++;
if (bid < price)d++;
price=bid;
Comment("عدد التكات الصاعدة = ",u,"\n","عدد التكات الهابطة = ",d);
return(0);
}
إداني خطأ فهمت منه إن المقارنة خطأ عشان المتغير bid نوعه doubel والمتغير price نوعه string
وانا عملت الكود كامل عشان تتوضح الفكرة أكتر وربنا يكرمك ويجزيك الخير :eh_s(7):
3 مرفق
رد:موضوع مخصص للأسئلة البرمجية
استاذ اسامة ، النسخة بالمرفقات هى آخر نسخة أعمل عليها حاليـا وهى الآن تعمل بشكل أفضل من قبل على منصة FXDD ، ولكن ظهرت بعض الأخطـاء مثل invalid ticket for OrderModify function
وبعض الصفقـات ايضـا لايتم وضع التارجت والاستوب لها اى لايحدث مودفاى للأوردر .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
تفضل
كود PHP:
double price;
int digits;
int u;
int d;
//----------------------------------------------------------
int init()
{
if(Digits>3){
digits=4;
}
else {
digits=2;
}
return(0);
}
//----------------------------------------------------------
int start()
{
string pr=DoubleToStr(Bid,Digits);
double bid=StrToDouble(StringSubstr(pr,0,digits));
if (bid > price)u++;
if (bid < price)d++;
price=bid;
Comment("عدد التكات الصاعدة = ",u,"\n","عدد التكات الهابطة = ",d);
return(0);
}
شكرا يا أستاذ أسامة
ده نفس الكود الأول :asvc:
المرة دي شغتله وبرضه العداد ماشتغلش لكن سبته فترة أطول وعملت تصغير للمنصة ورجعت رفعتها لقيته عد فعلا لكن قعدت راقبته لقيته وقف عد صغرت المنصة ورجعت فتحتها لقيته العدد زاد :(
وانا آسف بجد الجزء ده ماعرفش عنه حاجة
كود PHP:
string pr=DoubleToStr(Bid,Digits);
double bid=StrToDouble(StringSubstr(pr,0,digits));
عشان كده مش قادر أتفاعل معاك في الكود ده واظبط فيه
حاجة تانية مهمة يا أستاذ أسامة
إحنا حاليا بنخفي الخانة الخامسة مش بنشيلها مش كده ؟
طيب لو الكود بدأ والسعر كان 1.25123 والمتغير نوعه double وخفينا الخانة الأخير هيبقى الرقم كده 1.2512 ولا 1.2513
الأقرب إنه يعمله 1.2512 صح ولو عمله كده فعلا ياترى لما يوصل السعر للـ 1.25126 هتبقى القيمة 1.2513
ولا هيستنى 10 أجزاء كاملة عشان يعملها نقطة يعني لو بدأ زي ماقلنا من عند 1.25123 هيستنى 1.25133 وقتها يزود 1 في العداد
انا محتاج 10 أجزاء كاملة ربنا يكرمك يا أستاذ أسامة :hands:
تحياتي
2 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
هذا الخطأ قد يحدث عندما تحاول فتح صفقه لكن يحدث خطأ ولا تفتح الصفقه ثم تستخدم بعدها الأمر
كود PHP:
if(TP!=OrderTakeProfit()||SL!=OrderStopLoss())
{
OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),0,Red);
}
فإذا لم تفتح الصفقه فبالتأكيد سيكون هناك خطأ في رقم التيكيت
فقم بوضع شرط إضافي
كود PHP:
if(TP!=OrderTakeProfit()||SL!=OrderStopLoss()&&ticket>0)
{
OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,digits),NormalizeDouble(TP,digits),0,Red);
}
بعد عمل التعديل لم تظهر رسالة الخطـأ ورسالة OrderSend Error 129 نادرا ماتظهر الآن على منصة FXDD ، ولكن عند العمل على منصة 4 أرقام مثل Windsor بعض الصفقات لايتم عمل مودفاى للتارجت والاستوب لها وخاصة مع زوج GBPJPY !!
هل يوجد كود فـ الاكسيبرت يمنع عمل مودفاى للتارجت والاستوب على منصة الـ 4 أرقـام !!
2 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة spiders101
بعد عمل التعديل لم تظهر رسالة الخطـأ ورسالة OrderSend Error 129 نادرا ماتظهر الآن على منصة FXDD ، ولكن عند العمل على منصة 4 أرقام مثل Windsor بعض الصفقات لايتم عمل مودفاى للتارجت والاستوب لها وخاصة مع زوج GBPJPY !!
هل يوجد كود فـ الاكسيبرت يمنع عمل مودفاى للتارجت والاستوب على منصة الـ 4 أرقـام !!
صورة أخرى لبعض الصفقات التى لم يتم عمل مودفاى للتارجت والاستوب لها .
ولم تظهر أخطـاء فقط OrderSend Error 129 مرة واحدة حتى الآن ، ما السبب فـ عدم عمل الاكسيبرت مودفاى لبعض الصفقات !!
https://forum.arabictrader.com/attac...7&d=1340910802
https://forum.arabictrader.com/attac...8&d=1340911195
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
و عذرا أخي لو اتعبتك معي سوف أرفق لك الإكسبيرت الذي أبرمجه و أشرح لك فكرته لتطلع عليه وتصححلي ما فيه من أخطاء :
1- الإكسبيرت يقوم بوضع أمرين معلقين سيل استوب و باي ستوب على أساس وجود مستويين مرسومين على الشارت أعلى و أدنى السعر ... وقيمة اللوت تكون لوت1 .. و إستوب و هدف لكل أمر معلق المسافه بين المستويين .
2-إذا تفعل البيع لوت1 يتم مسح أمر الشراء وتعليق أمر معلق شراء بلوت2 عند المستوى العلوى و الهدف و الإستوب المسافه بين المستويين .(و العكس في حال تفعل الشراء لكن سأمشي في الشرح مع هذه الصفقه ).
(في حالة تم ضرب الهدف يتم إلغاء الأوامر و يتوقف الإكسبيرت)
3- إذا تم ضرب ستوب البيع بلوت1 وتفعل الشراء بلوت2 يتم تعليق أمر بيع بلوت3 عند أدنى نقطه وصل لها السعر قبل تفعل الشراء المفعل و الهدف و الإستوب الفرق بين المستوى العلوي السابق المرسوم على الشارت وأدنى نقطه وصل لها السعر ... و يتم أيضا تعديل ستوب الشراء المفعل إلى أدنى نقطه وصل لها السعر .
4- إذا تم ضرب ستوب الشراء بلوت2 و تفعل البيع بلوت3 .. يتم تعليق أمر شراء بلوت 4 عند أعلى نقطه وصل لها السعر قبل تفعل صفقة البيع الحاليه و الهدف و الإستوب يكون الفرق بين أعلى نقطه وصل لها السعر و قيمة ستوب آخر صفقه مغلقة ... و يتم أيضا تعديل ستوب البيع المفعل إلى أعلى نقطة وصل لها السعر .
.. أنوي عمل حتى لوت 10 بهذه الطريقه .. و قمت ببرمجة حتى الخطوة الرابعه إلى الآن و لكن هناك بعض الأخطاء أرجو الإطلاع عليها و تصحيح أي شئ آخر قبل أن أكمل ..
شكرا جزيلا أخي أسامه و بارك الله فيك .
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
هذا لأنك نسيت أن تضع الفاصله المنقوطه في نهاية السطر البرمجي
كود PHP:
int barshift=iBarShift(Symbol(),0,lasttime(),false)
ضعها وستحل المشكله
تمام أخي أسامه فعلا كانت الفاصله المنقوطه هي السبب .. و بارك الله فيك
الآن أخي أنا إنتهيت من الإكسبيرت وعندما بدأت أجربه على الديمو لأضع مستويين أفقيين أحدهما أعلى السعر و الآخر أسفله لأرى كيف يضع الأوامر و جدت الإكسبيرت يفعل فقط أمر السيل ستوب و يقوم بوضع كميه كبيره من الأوامر السيل ستوب و المشكله الأخرى أنه يقوم بوضع الأمر من نقطه خاطئه ..
فقد إستخدمت التعريفات التاليه :
كود PHP:
double line1=ObjectGet("buy",OBJPROP_PRICE1);
double line2=ObjectGet("sell",OBJPROP_PRICE1);
///---
double sp=(Spread*point);
double pips=(PipsFromLine*point);
double buy=(line1+sp+pips);
double pips2=(PipsFromLine*point) ;
double sell=(line2-pips2);
و الخطوه رقم 1 للإكسبيرت هي تعليق الأمرين عند المستويين من النقطه buy و النقطه sell و هما المستويان مضاف لهما السبريد و لمستوى الشراء عدد آخر من النقاط غير السبريد كما بالتعريفات السابقة:
كود PHP:
//////////// 1- put the buy sop///////////
if (MyBuyPendingOrdersTotal(MagicNumber)==0 && USE_BUYSTOP==TRUE && Time0!=Time[0]) {
if((TimeCurrent()-LastClosedOrderTime())/60/60>=9999)
{
if(StopLoss==0||HideSL){SL=0;}else{SL=Ask-StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Ask+TakeProfit*point;}
if(UseRecTP)TP=(Ask+TP_R);
if(UseRecSL)SL=(Ask-SL_R);
OrderSend(Symbol(),OP_BUYSTOP,Lots1,buy,3,SL,TP,"first",MagicNumber,0,Green);
PlaySound("Alert.wav");
Time0=Time[0];
}
}
///////////////////////////////////////////////////////////////////////////////////////////
///////////////1- put the sell stop//////////////
if (MySellPendingOrdersTotal(MagicNumber)==0 && Time0!=Time[0]&& USE_SELLSTOP==TRUE ){
if((TimeCurrent()-LastClosedOrderTime())/60/60>=9999)
{
if(StopLoss==0||HideSL){SL=0;}else{SL=Bid+StopLoss*point;}
if(TakeProfit==0||HideTP){TP=0;}else{TP=Bid-TakeProfit*point;}
if(UseRecTP)TP=(Bid-TP_R);
if(UseRecSL)SL=(Bid+SL_R);
OrderSend(Symbol(),OP_SELLSTOP,Lots1,sell,3,SL,TP,"first" ,MagicNumber,0,Green);
PlaySound("Alert.wav");
Time0=Time[0];
}
}
وقد إستخدمت دالة معرفة توقيت إغلاق آخر صفقة و وضعت في شرط أول خطوة هذا الشرط :
كود PHP:
if((TimeCurrent()-LastClosedOrderTime())/60/60>=99999)
وأيضا شرط :
حتى لا يتم تكرار تعليق الأوامر و مع ذلك كان يعلق الأوامر و من مكان خاطئ ..
رجاء الإطلاع أخي أسامه ومراجعة باقي الخطوات إذا كان هناك خطأ ..
و بارك الله فيك .
الإكســــــــــــــبيرت