النتائج 1 إلى 15 من 54
- 18-02-2016, 02:49 PM #1
اشكالية في .. اكسبيرت تنفيذ بحسب خط على الشارت
السلام عليكم
هذا الاكسبيرت يقوم بانشاء اوامر ماركت
حسب خط اضعه له
انشئ خطين
الخط الأول لفتح الصفقة ... الخط الثاني للهدف
اسم خط الصفقة ( شراء ) :
eBUY_Line123_Open_80
اسم خط الهدف
eBUY_Line123_hadf_80
( بيع ) SELL_Line123_Open_80 SELL_Line123_hadf_80
لا بد أن يكون آخر رقم متطابق بين فتح الصفقة وهدفها .. فيمكن انشاء عدة صفقات بأهدافها .. مثلا عن طريق مؤشر ينشي الخطوط
الاشكالية :
انه ينشئ اكثر من صفقة قد تصل ل6 صفقات وبأسعار مختلفة وحاولت ان اجعل البحث عن الصفقات المفتوحة في اطار السبريد مضاعفا (5 ن تقريبا )
ووضعت سليب 10 ثواني لكنه لم ينفذه
ايضا عندما يبتعد عن الخط ويحقق هدفه .. وثم يعود اليه ينشئ صفقات جديدة
طبعا لا استطيع حذف الخط بعد انشاء الصفقة .. لأنه ينشأ من مؤشر آخر
http://s000.tinyupload.com/index.php...78092084435262
آخر تعديل بواسطة أبو نـاصر ، 18-02-2016 الساعة 02:55 PM
- 18-02-2016, 04:03 PM #2
وأحيانا لا ينفذ اصلا
----
سأضيف اليه بعد حل الاشكالية :
اغلاق الصفقة عند وصول الBid لخط الهدف
اوامر الشراء تكون باي لميت على الخط بعد تجاوز ة بنقطين (الفريز زون)
- 18-02-2016, 09:17 PM #3
اخى ابو ناصر .. لو ترفق المؤشر الذي ينشئ الخطوط سيكون الامر اسهل ..
عموماً لدي بعض الملاحظات السريعة على الكود:
- التحويل من 4 الى 5 ارقام
كود PHP:Spread=(MarketInfo(Symbol(),MODE_SPREAD)/P)*Point;
الصحيح:
كود PHP:Spread=(MarketInfo(Symbol(),MODE_SPREAD))/P
كود PHP:double Pip=(T_Line-T_Line_hadaf)/Point/P;
كود PHP:double Pip=(T_Line-T_Line_hadaf)/P;
مثلا وضعت في خانة التيك بروفت قيمة T_Line_hadaf لكن بدون تحويل P* كما لم تحول قيمة ال Slippage
- لست بحاجة لاستخدام وظيفة "NormalizeDouble" لانها قد تسبب لك اخطاء
- لست بحاجة لاستخدام وظيفة Sleep والا يجب عليك استخدام "RefreshRates" حتى لا يحدث خطأ فروق بين الاسعار
- 18-02-2016, 10:54 PM #4
شاكرا تشريفك
ووقتك الذي منحنتني
فعلا المنصة خماسية
- سبب استخدام "NormalizeDouble" لأنه احيانا تأتي ارقام من 9 خانات بعد الفاصلة
- استخدمت الآن (*P) مع التيك بروفيت والسليباج كما تفضلت
كود PHP:
r = OrderSend(Symbol(),OP_SELL,Lots,Bid,3*P,0,T_Line_hadaf*P,Oo,Magicnumber,0,Red);
2016.02.18 22:14:56.950 '91479137': order sell 0.01 USDCADpro opening at market sl: 0.00000 tp: 13.71680 failed [Invalid S/L or T/P]
----
هل كود البحث عن الصفقات فيه اشكالية ؟؟
- 19-02-2016, 12:09 AM #5
في النسخة التالية هو ينشئ خطين للبيع والشراء
اضفت وضع بريك ايفن +2 ن .. للصفقة بعد وصوله ل50% من المسافة الى الهدف
ينشئ باي لميت بعد تجاوز الخط مباشرة (مثلا في اختراق القمم فلا ينفذ على السبريد قبل الاختراق)
اضفت مؤقتا حفظ موقع الخط وعدم التنفيذ مرة أخرى عليه .. لكنه ليس عملي ان زادت مواقع الاوامر
كود PHP:if ( T_Old_entry!= T_Line){
كود السبريد لعله انسب من السابق
كود PHP:double mydigit,mypoint;
if((Digits==5) || (Digits==3)) mydigit=Digits-1; else mydigit=Digits;
if((Point==0.001) || (Point==0.00001)) mypoint=Point*10; else mypoint=Point;
Spread = (Ask - Bid)/mypoint;
نسيت الغي السليب
http://s000.tinyupload.com/index.php...11469797760449
- 19-02-2016, 04:21 AM #6
العفو اخي ابو ناصر .. دائماً في الخدمة ان شاء الله
شوف يا اخي ... هناك فرق بين Slippage و Takeprofit or Stoploss من حيث التحويل
راجع الكود التالي لفهم الفارق، هذا الكود يعمل على اي بروكر كما يعمل على العملات والمعادن:
كود PHP:// 4/5 digit brokers.
int pips2points; // For slippage: 3 pips, 3=points, 30=points
double pips2double; // For Takeprofit & Stoploss: 15 pips, 0.015, 0.0150
int Digitspips; // DoubleToStr(double/pips2double, Digitspips)
// JPY=3/EURUSD=5
if (Digits % 2 == 1)
{
pips2double = Point*10;
pips2points = 10;
Digitspips = 1;
}
else
{
pips2double = Point;
pips2points = 1;
Digitspips = 0;
}
// OrderSend(... Slippage_Value * pips2points, Bid - StopLoss_Value * pips2double
- خطأ وضع وظيفة (start) تحت وظيفة (init)
- لا تنسي تحويل المتغيرات عند انشاء الخطوط .. مثال
كود PHP:DrawTrendLine(T_Zone+"Open"+"_"+IntegerToString(No),0,Time[0],Bid-(10*pips2double),Time[10],Bid-(10*pips2double),Red,STYLE_SOLID,3);
- للافضل ولانه لابد من ذلك لكي يعمل اي مؤشر او اكسبيرت بشكل صحيح مستقبلاً، لابد من استخدام وظيفة (property strict) لتجنب الكثير من الاخطاء البرمجية التي ستؤثر بالطبع على الكود اجمالاً
ولذلك بعد وضع (property strict) ظهرت بعض الاخطاء:
- يجب تعريف متغيرات T_order_No و B_order_No في الجلوبال وليس داخل شرط
- دمج شرطكود PHP:if(Bid==T_Line)
- ايضاً دمج شرط
كود PHP:if(type==OP_SELLSTOP || type==OP_SELLLIMIT || type==OP_SELL)
كود PHP:for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magicnumber)
{
int type=OrderType();
double OpEn_Price=OrderOpenPrice();
if(type==OP_SELLSTOP || type==OP_SELLLIMIT || type==OP_SELL)
{
if(Price_==OpEn_Price)
{
return(1);
}
}
}
}
كود PHP:DrawTrendLine(T_Zone+"Open"+"_"+No, ....
كود PHP:DrawTrendLine(T_Zone+"Open"+"_"+IntegerToString(No), ....
كود PHP:string Oo="T_Line"+T_Zone_No_+"_"+period(Period())+"_"+"Pip"+Pip;
كود PHP:string Oo="T_Line"+T_Zone_No_+"_"+period(Period())+"_"+"Pip"+DoubleToStr(Pip,2);
مرفق نموذج للبيع مع التعديلات في حالة كانت المشاركة غير واضحة
- 19-02-2016, 02:28 PM #7
يعلم الله كم اسعدتني مشاركتك وافادتني
فأشكرك من اعماقي
فعلا شغل فنان
عزيزي
مالفرق بين السطرين التاليين
كود PHP:
if(!OrderSend(Symbol(),OP_SELL,Lots,Bid,3*pips2points,0,T_Line_hadaf,Oo,Magicnumber,0,Red))
bool r = OrderSend(Symbol(),OP_SELL,Lots,Bid,3*pips2points,0,T_Line_hadaf,Oo,Magicnumber,0,Red);
اعمل كومبايل جديد
واسحب خط فتح الصفقة الى قريب البيد
ستجد انه احيانا ينفذ وأحيانا لا ينفذ << حسب مزاجه
وهي اشكالية كانت من البداية فما سببها ؟؟
-----------
لا اخفيك عزيزي
عملت هذا الاكسبيرت كبداية (https://forum.arabictrader.com/t234936.html)
وواجهت مشكلة انشاء الأوامر المعلقة بدون قيود .. وايضا تنوع المهام في الاكسبيرت تجعلني لا بد أن أخطئ في الكود
فقررت ان يكون مؤشر يرسم خطوط فقط ( تشريع )
واكسبيرت (تنفيذ ) ينفذ ويتابع الصفقة في نفس الزوج (هو الذي اعمل عليه الآن في الموضوع )
وسكربت (قائد ) لأدارة المحفظة بشكل عام (على مستوى كامل الازواج) يسمح ويمنع من انشاء الصفقات - ويتابع الرصيد كاملا المارجين والاكويتي والربح والخسارة ... https://forum.arabictrader.com/t235050.html
وأخيرا سكربت اتابع فيه الحساب (https://forum.arabictrader.com/t235174.html) حيث اتابع كامل ما يجري
سبب فشل اغلب الاكسبرتات .. يحاول دمج كامل المهام فينسى او يغفل عن جزئية قد تكون هي سبب الدمار له
مشروع كبير .. لا اعلم ان كان سينجح .. لكن لم أجد بديلا عنهآخر تعديل بواسطة أبو نـاصر ، 19-02-2016 الساعة 02:31 PM
- 19-02-2016, 06:37 PM #8
تحياتي اخي ابو ناصر .. يعلم الله انني اسعد، فالقدرة على مساعدة الاخرين شعور رائع لا يوصف فالحمد لله الذي تتم بنعمته الصالحات ..
تساؤلاتك يا اخي مرتبطة ببعضها .. في تحديثات الميتاتريدر الجديدة كما هو معروف انه يجب عليك التحقق من شروط ارسال وتعديل وغلق ومسح الاوردرات وهل تمت بشكل صحيح او لا .. وللمبرمجين عدة طرق لاتمام هذا الامر ..
في السطرين بالاعلى، الشرطين واحد ويعطيان نفس النتيجة ولكن الفارق مهم في معرفة هل تم الامر بشكل صحيح ام لا.
اولا نوع الامر: (OrderSend) من نوع int يرجع قيمة رقمية في حين (OrderModify) و (OrderDelete) و (OrderClose) من نوع bool وترجع قيمة true / false
لذلك يفضل وضع متغير من نوع int لل (OrderSend) ومتغير من نوع bool الى (OrderModify) و (OrderDelete) و (OrderClose)
فيكون الاصح ان تكتب
كود PHP:int r = OrderSend(Symbol(),OP_SELL,Lots,Bid,3*pips2points,0,T_Line_hadaf,Oo,Magicnumber,0,Red);
كود PHP:if(r < 0) Print("Error sending order #", OrderTicket(), " Error: ", GetLastError());
else Print("Order #", OrderTicket()," sent successfully.");
والطريقة الاسهل لفعل ذلك، اذا كنت لا تريد التحقق من عدد الاوردرات وبلا وضع وتعريف متغيرات جديدة سواء int او bool هي ان تستخدم علامة التعجب (!) التي تعنى (لا) مثال
كود PHP:if(!OrderSend(Symbol(), OP_SELL, ..........))
Print("Error sending order #", OrderTicket(), " Error: ", GetLastError());
else Print("Order #", OrderTicket()," sent successfully.");
المشكلة ان وظيفة GetLastError ترجع لك رقم الخطاً وبالطبع من المستحيل ان تحفظ كل هذه الارقام ولذلك فالحل الامثل ان تقوم بدمج ملف وصف الاخطاء مع اي مؤشر او اكسبيرت باضافة الكود التالي في اعلى هيدر الكود
كود PHP://--- Dependencies
#import "stdlib.ex4"
string ErrorDescription(int e);
#import
كود PHP:if(!OrderSend(Symbol(), OP_SELL, ..........))
Print("Error sending order #", OrderTicket(), " Error: ", ErrorDescription(GetLastError()));
else Print("Order #", OrderTicket()," sent successfully.");
ويمكن ان تستعمل هذا للتحقق من اي شيئ مثلا رسم الكائنات، مسحها، تعديل الاوردرات .. الخ
ايضاً من الهام جداً لك يا اخي .. ان تقوم بالتحقق الدائم والسريع من قيمة المتغيرات اذا كانت صحيحة او لا باستخدام امر Comment .. لا تتصور كما سيوفر عليك مجهودك ووقتك .. مثلا انت قمت باستحضار قيمة متغير
كود PHP:T_Line_hadaf=ObjectGet(ObjectName(i),OBJPROP_PRICE1);
كود PHP:_Line_hadaf=ObjectGet(ObjectName(i),OBJPROP_PRICE1);
Comment( T_Line_hadaf );
آخر تعديل بواسطة awran5 ، 19-02-2016 الساعة 06:42 PM
- 19-02-2016, 07:28 PM #9
أهنيك على هذه الروح الطيبة
قال رسول الله صلى الله عليه وسلم "من مشى في حاجةِ أخيه حتى يثبتها له أظله الله عز وجل بخمسةٍ وسبعين ألف ملك يصلون عليه ويدعون له إن كان صباحاً حتى يُمسي وإن كان مساءً حتى يصبح ولا يرفع قدماً إلا حط الله عنه بها خطيئة ورفع له بها درجة"
وفي رواية له عن ابن عمر وحده أن النبي صلى الله عليه وسلم قال: "من أعان عبداً في حاجته ثبت الله له مقامه يوم تزول الأقدام". الصحيحة (608).
http://www.saaid.net/Doat/majed-eslam/13.htm
------
اشكرك على تنبيهاتك
سأعتمد GetLastError
من جهتي لا احب الكومنت ولا احب ان اذهب كل مرة الى الجورنال
فاضع بديل عنه انشاء نص على الشارت مع حجم خط كبير مناسب لي
كود PHP:
ObjectCreate("g363", OBJ_LABEL, 0, 0, 0);
ObjectSet("g363", OBJPROP_CORNER, 2);
ObjectSet("g363", OBJPROP_XDISTANCE, 2);
ObjectSet("g363", OBJPROP_YDISTANCE, 50);
ObjectSetText("g363", T_Line_hadaf ,30, "Arial", Red);
اضفت صفقات الشراء كما تعلمت منك
واضفت OrderCheck() للتعامل مع صفقة البيع المفتوحة .. أرجوا التكرم بمراجعتها
أما صفقات الشراء تحتاج وضع مختلف .. لوضع اوامر باي لميت ان كان الاختراق لأعلى
الاكسبيرت كاملا هنا :
كود PHP://+------------------------------------------------------------------+
//| |
//| Copyright © 2015, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, MetaQuotes Software Corp."
#property strict
/*------------------------------------------------------------------*\
\\| -----------------------------------------------------------ا /
//| ------------------------------------------------------ا ا \
\\| ا ا ا أبو نـــاصر
//| ------------------------------------------------------ا ا /
\\| -----------------------------------------------------------ا \
\*------------------------------------------------------------------*/
double Lots = 0.01;
string T_Zone="SELL_Line123_";
string B_Zone="eBUY_Line123_";
int No=888;
int Magicnumber=1102011;
double T_Line,T_Line_hadaf,T_Old_entry ,B_Line,B_Line_hadaf,B_Old_entry;
string T_Zone_No_ , B_Zone_No_;
bool r;
int pips2points; // For slippage: 3 pips, 3=points, 30=points
double pips2double; // For Takeprofit & Stoploss: 15 pips, 0.015, 0.0150
int Digitspips; // DoubleToStr(double/pips2double, Digitspips)
double Spread;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
// 4/5 digit brokers.
// JPY=3/EURUSD=5
if (Digits % 2 == 1)
{
pips2double = Point*10;
pips2points = 10;
Digitspips = 1;
}
else
{
pips2double = Point;
pips2points = 1;
Digitspips = 0;
}
// OrderSend(... Slippage_Value * pips2points, Bid - StopLoss_Value * pips2double
Spread=MarketInfo(Symbol(),MODE_SPREAD)/Digitspips;
DrawTrendLine(B_Zone+"Open"+"_"+IntegerToString(No),0,Time[0],Bid+10*pips2double,Time[10],Bid+10*pips2double,DarkTurquoise,STYLE_SOLID,3);
DrawTrendLine(B_Zone+"hadf"+"_"+IntegerToString(No),0,Time[0],Bid+20*pips2double,Time[10],Bid+20*pips2double,DarkTurquoise,STYLE_SOLID,2);
DrawTrendLine(T_Zone+"Open"+"_"+IntegerToString(No),0,Time[0],Bid-(10*pips2double),Time[10],Bid-(10*pips2double),Red,STYLE_SOLID,3);
DrawTrendLine(T_Zone+"hadf"+"_"+IntegerToString(No),0,Time[0],Bid-(20*pips2double),Time[10],Bid-(20*pips2double),Red,STYLE_SOLID,2);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
double T_order_No=0;
double B_order_No=0;
string T_Name="SELL_";
string B_Name="eBUY_";
for(int i=0; i<=ObjectsTotal(); i++)
{
if(StringFind(ObjectName(i),T_Name,0)==0)
{
string Name22=StringSubstr(ObjectName(i),13,4);
if(Name22=="Open")
{
T_Line=ObjectGet(ObjectName(i),OBJPROP_PRICE1);
T_Zone_No_=StringSubstr(ObjectName(i),18,10);
}
if(Name22=="hadf")
{
if(T_Zone_No_==StringSubstr(ObjectName(i),18,10))
{
T_Line_hadaf=ObjectGet(ObjectName(i),OBJPROP_PRICE1);
}
}
if(Bid==T_Line)
{
if(T_Old_entry!=T_Line)
{
T_Old_entry=T_Line;//اضفت هذا ليعرف الخط الذي سبق التنفيذ عليه
T_order_No=chek_For_SELL_Order(T_Line);
if(T_order_No==0)
{
double Pip=fabs(T_Line - T_Line_hadaf) / pips2double;
string Oo="T_Line"+T_Zone_No_+"_"+period(Period())+"_"+"Pip"+DoubleToStr(Pip,2);
r = OrderSend(Symbol(),OP_SELL,Lots,Bid,3*pips2points,0,T_Line_hadaf,Oo,Magicnumber,0,Red);
}
}
}
}
//=======الشراء
if(StringFind(ObjectName(i),B_Name,0)==0)
{
string Name22=StringSubstr(ObjectName(i),13,4);
if(Name22=="Open")
{
B_Line=ObjectGet(ObjectName(i),OBJPROP_PRICE1);
B_Zone_No_=StringSubstr(ObjectName(i),18,10);
}
if(Name22=="hadf")
{
if(B_Zone_No_==StringSubstr(ObjectName(i),18,10))
{
B_Line_hadaf=ObjectGet(ObjectName(i),OBJPROP_PRICE1);
}
}
if(Bid==B_Line)
{
if(B_Old_entry!=B_Line)
{
B_Old_entry=B_Line;
B_order_No=chek_For_BUY_Order(B_Line);
if(B_order_No==0)
{
double Pip=fabs(B_Line_hadaf - B_Line) / pips2double;
string Oo="B_Line"+B_Zone_No_+"_"+period(Period())+"_"+"Pip"+DoubleToStr(Pip,2);
r = OrderSend(Symbol(),OP_BUY,Lots,Bid,3*pips2points,0,B_Line_hadaf,Oo,Magicnumber,0,Red);
}
}
}
}
}//end For
OrderCheck();
//----
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double chek_For_SELL_Order(double Price_)
{
double Aa=Price_+Spread;
double Vv=Price_-Spread;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magicnumber)
{
int type=OrderType();
double OpEn_Price=OrderOpenPrice();
if(type==OP_SELLSTOP || type==OP_SELLLIMIT || type==OP_SELL)
{
if(OpEn_Price < Aa && OpEn_Price > Vv)// اضفت هذا احترازا
{
return(1);
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double chek_For_BUY_Order(double Price_)
{
double Aa=Price_+Spread;
double Vv=Price_-Spread;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magicnumber)
{
int type=OrderType();
double OpEn_Price=OrderOpenPrice();
if(type==OP_BUYSTOP || type==OP_BUYLIMIT ||type==OP_BUY)
{
if(OpEn_Price < Aa && OpEn_Price > Vv)
{
return(1);
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OrderCheck()
{
for(int i=0;i<=OrdersTotal();i++){
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magicnumber)
{
int ticket=OrderTicket();
int type=OrderType();
double OpEn_Price=OrderOpenPrice();
double TP=OrderTakeProfit();
double SL=OrderStopLoss();
string Comm=OrderComment();
if(type==OP_SELL && OrderTakeProfit()!=0){
//بريك ايفن بعد تجاوز المنتصف
double Ll = OpEn_Price-((OpEn_Price-TP)/2) ;
if (Bid<Ll){
r= OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES);
r= OrderModify(OrderTicket(),OrderOpenPrice(),OpEn_Price-20*pips2double,OrderTakeProfit(),0);
}
if (Bid==TP){
//الغاء الهدف عند الوصول اليه
r= OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES);
r= OrderModify(OrderTicket(),OrderOpenPrice(),Ask+20*pips2double,0,0);
}
}
if(type==OP_SELL && OrderTakeProfit()==0){
//تريلينج ستوب بعد الغاء الهدف
SL=OrderStopLoss();
if (SL > Ask +20*pips2double){
r= OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES);
r= OrderModify(OrderTicket(),OrderOpenPrice(),Ask+20*pips2double,0,0);
}
}
}
} }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
string period(int TF)
{
string period;
switch(TF)
{
case 1:
period="M1";
break;
case 5:
period="M5";
break;
case 15:
period="M15";
break;
case 30:
period="M30";
break;
case 60:
period="H1";
break;
case 240:
period="H4";
break;
case 1440:
period="D1";
break;
case 10080:
period="W1";
break;
case 43200:
period="MN";
break;
}
return(period);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void DrawTrendLine(string r6,int x1,datetime x6,double f6,datetime x7,double f7,color x3,int x4,int x5)
{
if(x6==0 && x7==0 && ObjectFind(0,r6)!=-1) {ObjectDelete(0,r6);}
if(x6>0 || x7>0)
{
if(ObjectFind(0,r6)==-1)
{
ObjectCreate(0,r6,OBJ_TREND,x1,0,0,0,0);
ObjectSetInteger(0,r6,OBJPROP_RAY,false);
}
ObjectSetInteger(0,r6,OBJPROP_TIME,x6);
ObjectSetInteger(0,r6,OBJPROP_TIME,1,x7);
ObjectSetDouble(0,r6,OBJPROP_PRICE,f6);
ObjectSetDouble(0,r6,OBJPROP_PRICE,1,f7);
ObjectSetInteger(0,r6,OBJPROP_COLOR,x3);
ObjectSetInteger(0,r6,OBJPROP_STYLE,x4);
ObjectSetInteger(0,r6,OBJPROP_WIDTH,x5);
}
}
آخر تعديل بواسطة أبو نـاصر ، 19-02-2016 الساعة 07:34 PM
- 19-02-2016, 07:31 PM #10
اخي الفاضل هل لاحظت مشكلة عدم تنفيذ الأوامر في بعض الحالات
- 20-02-2016, 06:09 AM #11
بداية اعتذر عن التأخير يا اخي فاليوم جمعة واجازة السوق وراحة نوعاً ما
عزيزي ابو ناصر .. هذا هو الهدف ولله .. ونسأل الله سبحانه وتعالي الاخلاص لانه كما تعلم أن العمل لا يقبل منه إلا ما كان خالصاً لوجه الله تعالى، وصدقة العلم نشره خصوصاً في هذا العصر بعد انتشار المنتديات او وسائل التواصل المختلفة .. ويكفى ان نتصور انه توجد مواضيع في المنتدى من 2008 ومازلت نافعة ويتعلم منها الناس .. مثل مواضيع استاذ وضاح واستاذ اسامة وكل الاخوة الكرام ..
اكيد يا اخي .. كل الطرق تؤدي الى روما
ولله يا اخي .. الوظيفة بها بعض الاخطاء البرمجية وبعض الاخطاء المنطقية ان صح التعبير
اولاً: انت بحاجة لتعريف او تحديد الستوب قبل تحريكه الى البريك ايفن والافضل، ولكي يعمل هذا الاكسبيرت - واي اكسبيرت قادم - بشكل جيد على اي بروكر خصوصاً على شركات ECN او حتى احياناً اوقات الذروة، فالافضل هو ان تضع قيمة صفر سواء للستوب او التيك بروفت في امر OrderSend ثم تقوم بتعديل القيم بالقيم المطلوبة من خلال امر OrderModify.
ثانياً: لابد من اضافة بعض شروط التحقق قبل تعديل قيمة الستوب وتحريكها سواء الى نقطة البريك ايفن او التريلينج والا ستحدث اخطاء .. مثال في امر البيع
كود PHP:if((OrderOpenPrice()<OrderStopLoss()) || OrderStopLoss()==0)
if(OrderOpenPrice()-Ask> ..... * pips2double)
كود PHP:OrderStopLoss()==0
رابعاً: لا يمكن فعلياً "إلغاء الهدف عند الوصول اليه" لانه عند الوصول الى الهدف سيتم الغاؤه من البروكر بشكل تلقائي .. ممكن الغاء الهدف قبل الوصول اليه بكذا نقطة مثلا ولكن ليس عند الوصول اليه ..
خامساً: نفس الفكرة .. لا يمكن وضع تريلينج ستوب بعد الغاء الهدف لان التريل يكون بإتجاه الهدف ومرتبط به، فإذا تحقق الهدف سيتم الغاء التريل تلقائياً
سادساً واخيراً تحتاج الى آلية تعتمد على استراتيجة عند وضع الخطوط وبناء عليها نبدأ في وضع الاوامر المعلقة.
نعم لاحظت اخي الكريم واعتقد ان هذا المشكلة بسبب أن السعر عند فتح الاوردر يكون قد تجاوز قيمة الخط او مساوى لها وبالتالي لن يتحقق شرط الدخول .. لا تنسي يا اخي ان شرط الدخول يعتمد على سعر Bid او Ask وهو سعر متغير وفي احيان كثيرة يحدث هذا التغير بسرعة كبيرة جداً .. وعموماً يفضل دائما الاعتماد على ثابت في شرط الدخول مثل الشعمة رقم 1 او اخر هاي او ما شابه المهم شيئ ثابت وليس متغير وهذا يعيدنا الى نقطة آلية انشاء الخطوط ... اذكر ان الاستاذ وضاح قد نشر اكسبيرت في هذا الموضوع اظن ان فكرته نفس فكرة هذا الاكسبيرت .. هو الموضوع قديم لكن ممكن أن يفيدك.
في النهاية يا اخي .. مرفق الاكسبيرت بعد التعديلات التى ذكرتها في المشاركة .. ارجو ان تعمل معك بشكل جيد ..
تحياتي واحترامي ..
- 20-02-2016, 09:02 AM #12
أسأل الله أن يتقبل منك ما تبذل من زكاة
كما استفدت كثيرا من هذه الملاحظات
فكرة رائعة وجديرة بالتأمل .. لا اذكر اني رأيتها بأي اكسبيرت
الغاء هدف البيع عند وصول Bid إليه .. فلم يتفعل الهدف حتى الان وبقي فارق السبريد
ثم نضع تريلينج نقطتين + السبريد
استفيد ضمان اغلاق الصفقة + قد يوجد ربح اضافي
أو بدون التريلينج يمكن اغلاق صفقة البيع عند وصول سعر البيد إلى الهدف
صدقا هذه الجزئية اتعبتني كثيرا جدا وتتكرر باستمرار ان يلمس السعر الهدف ثم يعكس بدون تنفيذ (https://forum.arabictrader.com/t235234.html)
ومع الشراء سنقوم بالعكس ايضا ...
نعم عزيزي كما ذكرت لك سابقا هذا اكسبيرت تنفيذي فقط
ولا ارغب في اوامر معلقة الا في جزئيات
بسبب تكدس الاوامر المعلقة وبسبب حركة في السوق يكون تنفيذ جماعي خارج السيطرة
ولا تناسبني فكرة الغاء الأوامر المعلقة أو تقييدها حسب المحفظة ... فقد نلغي أوامر أو نمنع أوامر تكون قريبة من حركة قادمة .. ونترك أوامر بعيدة نوعا ما .. فرأيت أن نتركها خطوط ليختار السعر ما يريد منها والخط الذي يلمس هو الذي يهمنا
طيب لماذا ؟ وما الحل ؟
منطقيا نحن قلنا اذا اصبح سعر البيد مساوي لسعر الخط نفذ ماركت بسعر السوق ..
ووصل وتحقق الشرط .. ثم وصل للتنفيذ تغير السعر لم نطلب ان يكون بنفس السعر القديم
أو ربما نعود إلى (NormalizeDouble) فسعر الخط قد يكون من خانات بعد الفاصلة لا تساوي البيد أبدا ؟؟
في الميتا يقبل بـ 6 خانات بعد الفاصلة الدولار ين (113.000006) اليورو (1.111116) جرب الأرقام على المنصة
---
جميع الخطوط أفقية
بعضها يعتمد على قمم وقيعان .. وبعضها نتيجة معادلات (مثلا 50% من طول الموجة) .. وبعضها على هاي أو للو شمعة
لكن في التنفيذ أوامر الشراء التي( فوق السعر الحالي) تختلف عن أوام الشراء تحت السعر الحالي <<< بسبب السبريد
امر شراء فوق قمة وفوق السعر لا اريد أن ينفذ لي بسبب السبريد بدون اختراق فعلي .. فتكون خسارة .. بخلاف امر تحت السعر عند منتصف الموجة إن لم ينفذ تكون فرصة ولم تحصل
------------
اشكرك أخي الحبيبب جزيل الشكر على وقتك والذي اقتطعته من وقت راحتك وجهدك الكبير معيآخر تعديل بواسطة أبو نـاصر ، 20-02-2016 الساعة 09:07 AM
- 21-02-2016, 01:06 PM #13
ولله يا اخي مازلت اظن ان هذه المشكلة بسبب الاعتماد على سعر Bid او Ask في الدخول وقد تكون ايضاً مشكلة بروكر كما تفضل الاخوة
جرب يا اخي تستعمل RefreshRates
انا شخصياً لم استعمل NormalizeDouble اطلاقاً ودائماً ما كنت أقرا لبعض من محترفي برمجة mql في منتدى الميتا تريدر، انها وظيفة لا فائدة والافضل الاستغناء عنها .. بل واستخدامها قد يسبب مشاكل في الكود .. كما وأنه خطأ شائع استخدامها مع سعر Bid او Ask لان القيم بالفعل معدلة تلقائياً ..
لا اعتقد انها مشكلة سبريد .. حدثت المشكلة معى ايضاً حتى بعد ان وضعت قيمة صغيرة (15) ثابتة للسبريد في التسيتر .. كما انه يمكن بسهولة اضافة قيمة السبريد المتغيرة دائماً الى اوامر الدخول .. ممكن مثلاً للاختراق استعمال هاي لو الشموع بدلاً من السعر مثلاً
كود PHP:High[1] > value && Low[1] < value
كود PHP:if(Ask >= value + 20 *pips2double)
- 21-02-2016, 02:54 PM #14
أهلا بك حبيبي
طيب سؤال أنت كمبرمج تريد انشاء صفقة ماركت (بسعر السوق) .. وذلك عند تحقق شرط معين
لنعرف هل مشكلتنا من كود الشرط أو من كود التنفيذ
سأجرب كافة الاحتمالات مع افتتاح السوق حيث تجاربي على الديمو
---------
سؤال جانبي مع ذكرك الباكتيست
ما سبب كون الصفقة تنفذ على الهدف وتكون نتيجة الربح بالسالب
- 22-02-2016, 02:26 AM #15
لم افهم يا اخي هذه الجزئية
ولله يا اخي ايضاً لم افهم جيداً من الصورة .. الصورة لزوج الدولار/ ين ولكن بسعر قديم جداً .. اظنه 2012 ؟ هل يا اخي قمت بتحميل وتحديث الاسعار لكل هذه الفترة؟ لا اظن في هذه الحالة ان الباك تسيت سيعمل بشكل سليم لان الاسعار ستكون وهمية ..
قد يكون ايضاً بسبب الفيفو FIFO فإن لم اكن مخطئاً، فهذا الحساب من شركة forex.com ؟