رد:موضوع مخصص للأسئلة البرمجية
السلام عليكم استاذ اسامه لدى كذا سؤال :-
1-اردت ان اجعل الهدف هو الفرق بين اكبر هاى واقل لو لفترة 20 شمعه سابقه
فجعلت الكود هكذا
كود PHP:
int h=iHighest(Symbol(),0,MODE_HIGH,20,0);
int l=iLowest(Symbol(),0,MODE_LOW,20,0);
double tp;
double tppip=(h-l);
وبالنسبه لاوامر الشراء والبيع هكذا
كود PHP:
tp=Ask+tppip*point;
OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,digits),3*Q,NormalizeDouble(sl,digits),NormalizeDouble(tp,digits),"ahmed",magicnumber,0,Blue);
tp=Ask-tppip*point;
OrderSend(Symbol(),OP_SELL,lots,NormalizeDouble(Bid,digits),3*Q,NormalizeDouble(sl,digits),NormalizeDouble(tp,digits),"ahmed",magicnumber,0,Red);
فالاحظ انه لا يأتى بالقيمه الصحيحه فمثلا يكون الفرق بين اكبر هاى واكبر للو 30 فيعطينى 6 او 15 وهكذا
وايضا يعطنى باستمرار خطأ 130 على الرغم انى جعلت التيك بروفت كقيمه ثابته 30 والاستوب كذالك وايضا ونفس المشكله تظهر
اذا اردت الكود كاملا فهو
كود PHP:
//+------------------------------------------------------------------+
//| first.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Ahmed abdelatef"
#property link "Nothing"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern int stoploss=0;
extern int magicnumber=6630;
extern double lots=1;
extern int stocksell=80;
extern int stockbuy=20;
extern bool usemulti=false;
extern double multi=2;
extern int step=20;
double point;
int digits,Q;
int init()
{
if(Digits==5||Digits==3)Q=10;
else Q=1;
if(Digits<4)
{
point=0.01;
digits=2;
}
else
{
point=0.0001;
digits=4;
}
return(0);
}
//+------------------------------------------------------------------+
//| expert 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);
}
datetime time0;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int h=iHighest(Symbol(),0,MODE_HIGH,20,0);
int l=iLowest(Symbol(),0,MODE_LOW,20,0);
double openprice,newlot,lot;int s;double sl; double tp;
double tppip=(h-l)*5;
if(usemulti){
for(s=0;s<OrdersTotal();s++){
OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magicnumber&&OrderType()==OP_BUY){
openprice=OrderOpenPrice();lot=OrderLots();
}
}
}
{
newlot=multi*lot;
if(Ask<=openprice-step*point&&orderstotal()>=1){
tp=Ask+tppip*point;
if(stoploss==0){sl=0;}else{sl=Ask-stoploss*point;}
OrderSend(Symbol(),OP_BUY,newlot,NormalizeDouble(Ask,digits),3*Q,NormalizeDouble(sl,digits),NormalizeDouble(tp,digits),"ahmed",magicnumber,0,GreenYellow);
}
}
for(s=0;s<OrdersTotal();s++){
OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderType()==OP_SELL&&OrderMagicNumber()==magicnumber){
openprice=OrderOpenPrice(); lot=OrderLots();
}
}
{
newlot=lot*multi;
if(Bid>=openprice+step*point&&orderstotal()>=1){
tp=Ask-tppip*point;
if(stoploss==0){sl=0;}else{sl=Bid+stoploss*point;}
OrderSend(Symbol(),OP_SELL,newlot,NormalizeDouble(Bid,digits),3*Q,NormalizeDouble(sl,digits),NormalizeDouble(tp,digits),"ahmed",magicnumber,0,Chocolate);
}
}
/////////////////////////
double stock1=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1);
if(stock1<stockbuy&&lastorder()>0){
if(orderstotal()<1){
if(stoploss==0){sl=0;}else{sl=Ask-stoploss*point;}
tp=Ask+tppip*point;
if(time0!=Time[0]){
OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,digits),3*Q,NormalizeDouble(sl,digits),NormalizeDouble(tp,digits),"ahmed",magicnumber,0,Blue);
time0=Time[0];
PlaySound("alert.wav");
}
}
}
/////////////////////////////
if(stock1>stocksell&&lastorder()!=1){
if(orderstotal()<1){
if(stoploss==0){sl=0;}else{sl=Bid+stoploss*point;}
tp=Ask-tppip*point;
if(time0!=Time[0]){
OrderSend(Symbol(),OP_SELL,lots,NormalizeDouble(Bid,digits),3*Q,NormalizeDouble(sl,digits),NormalizeDouble(tp,digits),"ahmed",magicnumber,0,Red);
time0=Time[0];
PlaySound("alert.wav");
}
}
}
}
/////////////////////////////
int lastorder(){
for(int i=OrdersHistoryTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if (OrderSymbol()==Symbol()&&OrderMagicNumber()==magicnumber){
return(OrderType());
}
}
return(2);
}
//+------------------------------------------------------------------+
2- فى بعض الاكواد تكتب فى نهاية الداله او هكذا اليس الامر ريتيرن يعنى انه سيفحص الداله ويرجع بالقيمه المطلوبه واذا كانت هكذا اى سيظل يبحث فى الداله باستمرار اذا فما الفرق بينهما
3- اريد فهم عمل الحلقه جيدا فماذا تعنى الحلقه بهذا الشكل مثلا
كود PHP:
for(int i =OrdersTotal()-1;i>=0;i--){
وايضا فى بعض الاوقات مثلا عند ايجاد اخر عقد مفتوح تستخدم الداله بالتناقص هكذا
كود PHP:
double LastLot(){
for(int i=OrdersTotal();i>=0;i--){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
return(OrderLots());
}
}
return(0);
}
ومرات اخرى تستخدمه بالتزايد هكذا
كود PHP:
double LastLot(){
double L;
for(int i=0;i<OrdersHistoryTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber){
L=OrderLots();
}
}
return(L);
فما الفرق بينهما
واسف على الاطاله
2 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
ما رأيك بإضافة تعبير آخر للحلقه for
كود PHP:
int i,j;
for(i=0,j=1;i<=NumOF_Additional_LIMITSTOPLots;i++,j+=j){
if(OpenPrice(OP_BUY)!=0 &&orderstotal2(OP_BUYLIMIT)<i && NumOF_Additional_LIMITSTOP_Lots==true){
OrderSend(Symbol(),OP_BUYLIMIT,lot*j,OpenPrice(OP_BUY)-Space*point*i,5*Q,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits)," EA",MagicNumber,0,Blue);
}
تم التعديل ، ولى سؤال هل يمكن إضافة نوع آخر من المضاعفات مثل مضاعفات فيبوناتشي لمثل هذا النوع من الأوامر المعلقة وكيف يتم ذلك فـ حالة إستخدام الحلقة for
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
لا يوجد خطأ في الكود لكن إذا كنت تقصد
Function is not referenced and will be removed
فهذا ليس خطأ لكن لإنك لم تستخدم الداله ClosePrice داخل الكود فهو يخبرك بأن الداله سوف تم حذفها من ملف ex4 لأنها غير مستخدمه
إذا جعلت القيمة False فهو سيعود بأقرب بار للتوقيت المحدد إذا لم يجد البار الذي تم تحديد التوقيت له
إذا جعلت القيمه True فلن يبحث عن أقرب بار إذا لم يجد البار المحدد وسوف يعود بالقيمه -1 مباشرة
استاذ اسامة انا أعلم سبب ظهور رسالة Function is not referenced
ولكن أنا أريد معرفة لماذا لايتم إغلاق الصفقة على سعر إغلاق الشمعة السابقة ، وقمت بعمل اكسيبرت فقط لهذا الشرط فـ المرفقـات ، ومرفق صورة للصفقات التى لم يتم إغلاقها حسب الشروط
وأنا قمت بتعريف المتغيرات التالية خارج دالة ستارت
كود PHP:
double buys1,SeLLsl;
ووضع الشرط التالى داخل دالة ستارت
كود PHP:
if(Ask||Bid==buys1||SeLLsl){CloseOrders();}
هل يوجد خطـأ فـ الشرط السابق وما سبب مشكلة عدم الإغلاق على سعر إغلاق الشمعة السابقة
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
استاذ أسامة ، فـ الاكسيبرت المرفق عند تفعيل خاصية Reversed_Multiplier2 يتم فتح صفقات المضاعفات العكسية عن طريق وضع أوامر معلقة ، ووضعت هذه الشروط لفتح الصفقات
كود PHP:
if(OpenPrice(OP_BUY)!=0&&orderstotal2(OP_SELLLIMIT)<1&&LastOrderType()==OP_BUY&&Reversed_Multiplier2==true){
OrderSend(Symbol(),OP_SELLLIMIT,lot*2,OpenPrice(OP_BUY)-Space*point,5*Q,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits)," EA",MagicNumber,0,Red);}
if(OpenPrice(OP_SELL)!=0&&orderstotal2(OP_BUYLIMIT)<1&&LastOrderType()==OP_SELL&&Reversed_Multiplier2==true){
OrderSend(Symbol(),OP_BUYLIMIT,lot*2,OpenPrice(OP_SELL)+Space*point,5*Q,NormalizeDouble(SL,digits),NormalizeDouble(TP,digits)," EA",MagicNumber,0,Blue);}
ولكن يظهر خطـأ OrderSend error 130 سواء وضع تارجت او استوب او لم يتم وضعهم ، وايضـا لايتم وضع الأوامر المعلقة على الشارت