ماشاء الله عليك يا أستاذ
جزاك الله خيرا
Printable View
عندي سؤال
اذا اردت ان افتح اوردير عند سعر محدد على الشارت بالدالة ordersend
ووضعت فيها السعر المحدد فان الاوردير لا يفتح عن السعر المحدد
مثال
كما في المثال عملت اسكريبت يفتح عند سعر محدد ووضعت السعر في الدالة وعند تشغيل الاكسبيرت فان السعر لا يدخل عن 1.2870 بل اقل منه ب 4 نقاط 1.2866 غيرت الارقم وعملت دالةكود PHP:
double price=1.2870;
OrderSend(Symbol(),0,1,price,3,0,0,"My order",111,0,Green);
doublenormalize ولكن المشكلة هي هي لم تتغير
انا حللت المشكلة بطريقة اخري وعملت دالة مقارنة بين ask والسعر الذي اريده وعندما تصبح النتيجة = 0 فانه يفتح عند السعر المحدد لكن بها مشكلة لاحظتها بعد وقت وهي دالة المقارن عندما تساوى صفر بين سعر ال ask والسعر الذي اريد الدخول قد تفشل بسبب ان السعر في اوقات الحركة السريعة يحصل بها تجاوز فلا تمر بنقطة المقارنة الصفرية وهنا تنتظر حتى تستقر حركة السعر وتضيع فرص فالحل نعمل اكبر او يساوي لكن سؤالي المحدد والذي لفت انتباهي لماذا لم يفتح عند السعر المحدد دون التحايل على الدالة ؟
السلام عليكم ورحمة الله وبركاته
قمت بعمل ما هو مطلوب ولكن الاكسبيرت يفتح فقط الصفقة بالنسبة لخط N فقط اللي هو مركز الخطوط
أما باقي الخطوط H و L لا يعمل عليها الاكسبيرت !!!!
قمت بما يلي :
أيضا جربت هذا الكود ولم يعملكود:void TechnicalAnalysis()
{
for(int i=1;i<=20;i++)
{
double lineH=ObjectGet("Hi"+i,OBJPROP_PRICE1);
double lineL=ObjectGet("Li"+i,OBJPROP_PRICE1);
double lineN=ObjectGet("N",OBJPROP_PRICE1);
if ((Open[1] < lineN && Close[1] > lineN)||(Open[1] < lineH && Close[1] > lineH)||(Open[1] < lineL && Close[1] > lineL))
{
BuyOrder();
}
}
}
مؤشر الخطوط للمهندس وجدي جزاه الله خيراكود:void TechnicalAnalysis()
{
for(int i=1;i<=20;i++)
{
double lineH=ObjectGet("H"+i,OBJPROP_PRICE1);
double lineL=ObjectGet("L"+i,OBJPROP_PRICE1);
double lineN=ObjectGet("N",OBJPROP_PRICE1);
if ((Open[1] < lineN && Close[1] > lineN)||(Open[1] < lineH && Close[1] > lineH)||(Open[1] < lineL && Close[1] > lineL))
{
BuyOrder();
}
}
}
بالمرفقات
بارك الله فيكم :eh_s(7):
إذا أردت أن تفتح الصفقة عند سعر محدد وليس على سعر الأسك أو البيد فتستخدم الأوامر المعلقه
OP_BUYLIMIT , OPBUYSTOP , OP_SELLLIMIT , OP_SELLSTOP
ولو أنك وضعت الأمر بعيد عن السعر الحالي فلن يفتح أساسا سواء على بعد 4 نقاط أو لأ لكن السبب في أنه فتح على بعد 4 نقاط هو إستخدامك لعدد نقاط إعادة التسعير بالتالي عند أصبح السعر قريب من السعر الذي حددته فإعتبره الإكسبرت سعر يحقق الأمر ففتحت الصفقه
بالنسبه إذا كنت تريد جعل الأمر مباشر وليس أمر معلق فالحل أمامك هو إستخدام المقارنه كما ذكرت
أخي كيرا الدالة تعمل عندي على المؤشر إللي إنت أرفقته بدون أي مشاكل
ولتتأكد قم بفتح إكسبيرت جديد وقم بوضع الدالة المشروحة فيه فقط
أنا عوضت بأمر شراء مباشر بدلا من دالة الشراء وقمت بتعريف متغير Time1 ليفتح عملية واحدة فقط في الشمعة التي تحقق الشروط ( لا تهتم بـ Time1 دي انا وضعتها عشان أقدر أجرب بس وقمت بتعريفها خارج الدوال )كود PHP:
void TechnicalAnalysis()
{
for(int i=1;i<=20;i++)
{
double lineH=ObjectGet("H"+i,OBJPROP_PRICE1);
double lineL=ObjectGet("L"+i,OBJPROP_PRICE1);
double lineN=ObjectGet("N",OBJPROP_PRICE1);
if(Time1!=Time[0]){
if ((Open[1] < lineN && Close[1] > lineN)||(Open[1] < lineH && Close[1] > lineH)||(Open[1] < lineL && Close[1] > lineL))
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,30,0,0,"",123,0,Lime);
Time1=Time[0];
}
}
}
}
وقمت بإستدعاء الدالة في إستارتكود PHP:
int Time1;
جرب الكلام ده في إكسبيرت جديد وستجده يعمل معك كما تريدكود PHP:
int start()
{
TechnicalAnalysis();
return(0);
}
( وتأكد من أسماء الخطوط عندك على الشارت أنها H1 - H2 -H3 وهكذا )
طيب ممكن معادله اول لوت :0016:
نفس المشكلة أستاذي الاكسبيرت يفتح أمر فقط بالخط N اللي هو مركز الخطوط ولكي أتأكد عملت لكل خط شرط خاص به مرتبط بدالة الأمر
والأمر ليس ماركت بل أمر معلق
شوف كدة الكود الخاص بالخطوط H1 ; H2 .... هل صحيحة ؟ مع العلم بوجود المضاعفات
دالة الشرط
ثم دالة الأمر المعلقكود:void TechnicalAnalysisSell2()
{
for(int i=1;i<=20;i++){
double LineL=ObjectGet("Li"+i,OBJPROP_PRICE1);
if ((Open[1]>=LineL)&&(Low[0]<LineL))
{
SellOrderL();
}
}
}
بانتظار ردك أستاذ يوسف بارك الله فيك :eh_s(7):كود:void SellOrderL()
{
double profit = 0;
int cnt = OrdersHistoryTotal();
for (int i=cnt-1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNo)
{
profit = OrderProfit();
CurrentLots = OrderLots(); // take lots from the last order
break;
}
}
if (profit > 0) // had profit
{
CurrentLots = CurrentLots * LotsMpOnProfit + 0;
if (LotsResetOnProfit)
CurrentLots = Lots;
}
else if (profit < 0) // had loss
{
CurrentLots = CurrentLots * LotsMpOnLoss + 0;
if (LotsResetOnLoss) CurrentLots = Lots;
}
if (CurrentLots > MaxLots)
{
CurrentLots = Lots;
}
double lotvalue = CurrentLots;
if (lotvalue < MarketInfo(Symbol(), MODE_MINLOT)) // make sure lot is not smaller than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MINLOT);
}
if (lotvalue > MarketInfo(Symbol(), MODE_MAXLOT)) // make sure lot is not greater than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MAXLOT);
}
for( i=1;i<=20;i++)
{
double LineL=ObjectGet("Li"+i,OBJPROP_PRICE1);
double price = (NormalizeDouble(LineL, NDigits) - (SellStep*PipValue*Point));
double SL = price + Stoploss*PipValue*Point;
if (Stoploss == 0) SL = 0;
double TP = price - Takeprofit*PipValue*Point;
if (Takeprofit == 0) TP = 0;
int Tries;
int ticket = -1;
if (ECNBroker)
{
ticket = OrderSend(Symbol(), OP_SELLSTOP, lotvalue, price, Slippage, 0, 0, "Kira-h", MagicNo, 0, Red);
if(ticket>-1 && Tries<10)
{
OrderSelect(ticket, SELECT_BY_TICKET);
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Blue);
Tries++;Sleep(1000);
}
}
else
ticket = OrderSend(Symbol(), OP_SELLSTOP, lotvalue, Bid, Slippage, SL, TP, "Kira-h", MagicNo, 0, Red);
}
}
أخي كيرا
أنا مش فاهم إنت تقصد تعمل إية ؟
إنت عايز تعمل أوامر معلقة على كل خط فوق شراء وعلى كل خط تحت بيع ؟
طيب لو عايز تعمل أوامر معلقة يبقى إزاي عامل شرط إن الشمعة تغلق فوق الخط ؟
-----------
ياريت تشرح بمثال
-------------------
كمان إنت كاتب إسم الكائن بين علامات التنصيص "Li" و "Hi" هل ده إسم الكائن على الشارت عندك ولا "H" و "L"
---------------------
وفي النهاية أنا مش شايف سبب لإستدعاء مؤشر لتحديد مناطق الدخول
المؤشر مفيش فيه حاجة مميزة ... بتحدد نقطة في النص وتكتبها في خصائص المؤشر والمؤشر بيضع خطوط على بعد معين من النقاط إنت بارضوة إللي بتحدده
يعني مش مؤشر دعوم ولا مقاومات ومفيش فيه حاجة ما تقدرش تعملها مباشرة من الإكسبيرت
وعندك إكسبيرت الأوامر المعلقة من برمجة أستاذ أسامة بيقوم بالوظايف دي كلها مباشرة بدون مؤشرات
شكرا جزيلا على تفاعلك أستاذي العزيز ربنا يخليك :asvc:
الطريقة بسيطة جدا
أسماء الخطوط H1 ; H2 ; H 3 .... إلى H20
وأيضا L1 ; L2 . L3 ....إلى L20
ثم خط الوسط باسم N
حينما يلمس السعر أي خط من الخطوط دي يضع أمرين معلقين باي ستوب فوق الخط وسيل ستوب تحت الخط
بالنسبة للاكسبيرت الان يضع فقط أمرين بالخط الوسط N وعندما يصعد السعر ويلمس مثلا H1 لا يضع أمرين بنفس الطريقة ...
مع أن عدد العقود غير محدود
دي المشكلة !!!
استاد ماستر دولار كيف يمكنني تحديد اخر صفقة مفتوحة و تغيير الستوب الوز لها
بارك الله فيك
بعد اذن مستر دولار والاعضاء والتصحيح ان كان عندي خطا في الرد
تحديد اخر صفقة مفتوح يتم من بالمقارنة بالماجيك نمبر ونوع العملة ونوع الصفقة بيع اوش راء والاهم موقعها وفي الغالب من orderselect
فاذا كان لديك فرضا 5 صفقات مفتوحة والاخيرة رقمها التسلسلي 4 لان اول صفقة يكون رقمها 0 هنا يمكن ان تحدد رقم الصفقة الاخيرة وهي orderstotal()-1
وتضعه في دالة orderselect
ومنها تحدد عن طريق ordermodify()
تغيير الوقف
هذا والله اعلم