رد:موضوع مخصص للأسئلة البرمجية
الأخ العزيز الاستاذ أسامة بعد التحية
صممت اكسبرت يقوم بفتح صفقتي buy limit و صفقة sell limit في وقت واحد طبقا لشروط معينة ولكني اسأل حضرتك عن كيفية كتابة الاكواد الخاصة عند تفعل أحد هذه الاوامر يقوم بالغاء الامر الآخر بمعنى عندي تفعل buy يقوم بحذف الامر المعلق الاخر sell limit وفي حالة تحقيق الاهدف الانتظار مره اخرى للدخول اما في حالة ضرب الاستوب لوز يقوم من نفس نقطة ضرب الاستوب لوز فتح صفقة معاكسة بضعف اللوت السابق بمعني يا استاذ أسامة في حالتنا هذه تفعلت صفقة buy وضربت استوب يقوم الاكسبرت بفتح صفقة sell من نفس نقطة الاستوب لوز للصفقة السابقة بلوت مضاعف وفي حالة الحصول منها على الهدف الامر انتهى اما في حالة ضرب الاستوب لوز مره اخرى يقوم الاكسبرت من نفس نقطة ضرب الاستوب لوز بفتح امر معاكس buy من نفس نقطة ضرب الاستوب لوز للصفقة السابقة وهكذا لحين اللوصول للهدف وعندئذ العودة من جديد عند انتظباق الشروط يفتح buy limit و sell limit وهكذا معلش تعبت حضرتك معي وفي انتظار الدوال البرمجية وجزاك لله كل خير
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة AMINDESETIF
السلام عليكم
شكرا اخى الكريم Jmeel
لم اعرف صياغة دالة تحريك السعر + اضافتها الى اختيارات الاكسبير
لو ممكن الدالة
تفضل هذه هي الدالة
كود PHP:
void MoveTrailingStop()
{
int cnt,total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
if(TrailingStop>0&&NormalizeDouble(Ask-TrailingStep*point,digits)>NormalizeDouble(OrderOpenPrice()+TrailingStop*point,digits))
{
if((NormalizeDouble(OrderStopLoss(),digits)<NormalizeDouble(Bid-TrailingStop*point,digits))||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*point,digits),OrderTakeProfit(),0,Blue);
}
}
}
else
{
if(TrailingStop>0&&NormalizeDouble(Bid+TrailingStep*point,digits)<NormalizeDouble(OrderOpenPrice()-TrailingStop*point,digits))
{
if((NormalizeDouble(OrderStopLoss(),digits)>(NormalizeDouble(Ask+TrailingStop*point,digits)))||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*point,digits),OrderTakeProfit(),0,Red);
}
}
}
}
}
}
وهذا الشرط تضعه في دالة Start
كود PHP:
if(TrailingStop>0)MoveTrailingStop();
وهذه خانى الأختيارات تضعها في بداية الأكسبيرت
كود PHP:
extern int TrailingStop=0;
extern int TrailingStep=0;
أرجع للأكسبيرت ستتعلم منه أكثر .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة waleedgadelmola
للرفع مستر دولار او الاستاذ العزيز Jmeel
=======
في الأول حتحتاج دالة بسيطة لحذف المعلق بعد تفعيل احدهم
كود PHP:
int TotalOrderByType(int type){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNo&&OrderType()==type){
cnt++;
}
}
}
return(cnt);
}
ثم ستضع الشرط اذا العقد للشراء اكبر من 0 و المعلق اكبر من 0 الغي المعلق بيع ، ثم تعدل الشرط لألغاء المعلق شراء
كود PHP:
If(TotalOrderByType(OP_BUY)>0 && TotalOrderByType(OP_SELLSTOP)>0) // Delete SellStop
السؤال الثاني لموضوع المضاعفة ، سيكون اذا اغلقت بخسار افتح عكسها بضعف اللوت
هذه الدالة
كود PHP:
double LastOrderProf(int type){
for(int i= OrdersHistoryTotal ()-1; i>=0; i--){
OrderSelect(i,SELECT_BY_POS, MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNo&&OrderType()==type){
return(OrderProfit());
}
}
return(0);
}
والشرط هو
كود PHP:
If(LastOrderProf(OP_BUY)<0) // OPSELL
واهلا بك .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة محمد آل مسيري
يعطيك ألف عافية حبيبنا ،،، بالنسبة للمشكلة الثانية تم حلها بنجاح
بالنسبة للمشكلة الأولى نحن أخذنا وقت آخر صفقة تم اغلاقها .. وهذا المقياس ليس دقيق ..
فمثلاً قد تكون آخر صفقة تم فتحها لم تغلق بعد ( والتي اغلقت ربما تكون صفقة قبل ساعات وساعات ) .. وكذلك هناك حالة ( يمكن أن يكون هناك صفقة بيع وصفقة شراء تدخلان للسوق في نفس الوقت مثلاً عند الساعة 1 ظهراً بالتمام 1.00 قد يكون هناك صفقة بيع وشراء وبالتالي منع أي صفقة مباشرة يعني أن صفقة واحدة فقط هي التي سوف تدخل السوق ) .
فما هو الحل برأيك عزيزي ؟
يمكنك أن تقوم بتعريف متغير لحفظ الشمعه التي تم فتح صفقه فيها
كود PHP:
static datetime Time0;
ثم ستضع من ضمن شروط الإكسبرت
كود PHP:
if(Time0!=Time[0])
وعندما يتم فتح صفقة سوف تضع الكود
بالتالي لن تفتح صفقة أخرى في نفس هذه الشمعه التي تحققت فيها الشروط إلا مره واحده فقط
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة waleedgadelmola
أخي الكريم الاستاذ جميل أولا بشكرك لتعبك معي بس صراحة الامر غير واضح معي سوف أقوم بالتوضيح أكثر
اولا عند تحقق الشروط في عمل الاكسبرت يقوم بتعليق التالي :
Sell Limit
Buy Limit
وهذه الاوامر كل افتتاح شمعه جديده فاذا انتهت الشمعه ولم يتم تفعيل أحد هذه الاوامر يتم حذفها وتعليق أوامر جديدة عن اسعار جديدة
في حالة تفعل هذه الاوامر وليكن Buy Limit وأصبح امر Buy
هنا لابد من الاتي
حذف الامر المعلق السابق Sell Limit ووضع أمر معلق جديد عند سعر الاستوب لوز للامر Buy ولكن هذه المرة تعليق Sell Stop بضعف اللوت للصفقة المفتوحة الحالية Buy
هنا احتمالين
الاحتمال الاول تحقيق الامر المفتوح الحالي وهو Buy لهدفة وهنا يتم حذف الامر المعلق Sell Stop وانتهى الأمر
الاحتمال الثاني عدم تحقيق الأمر المفتوح الحالي وهو Buy لهدفة وتم ضرب الاستوب لوز هنا سوف يتم تفعل الامر المعلق Sell Stop بضعف اللوت لكي يصبح لدينا أمر Sell وهنا لابد فورا من تعليق أمر معلق Buy Stop عند نقطة الاستوب لوز للامر المفتوح الحالي Sell بضعف اللوت للأمر المفتوح وهكذا أخي الكريم
بمعني
عند افتتاح كل شمعة يتم تعليق أمرين
Sell Limit و Buy Limit والانتظار لحين تفعل احدهم فان لم يتم تفعيل احدهم يتم الالغاء وتعليق أوامر جديدة عند افتتاح الشمعة الجديدة
اما اذا تم تفعيل احدهم يتم وضع أمر معلق بضعف اللوت للامر المفتوح وعند سعر الاستوب لوز للامر المفتوح ولكن هذه المرة هو عكس الامر المفتوح Stop بمعنى إن تم تفعيل الامر Sell يتم وضع امر معلق Buy Stop عند سعر الاستوب لوز للصفقة المفتوحة الحالية Sell وهكذا أخي الكريم لحين الوصول للهدف ان شاء الله
أرجو التكرم بوضع الدالات المناسبة بالكامل وجزاك الله خيرا
أنت شرحت الشروط بكل تفصيل باقي فقط أن تحويل هذه الأوامر إلى كود بنفس الطريقه التي شرحتها
قم بعمل دالة لمعرفة عدد الأوامر المعلقة حسب نوعها
كود PHP:
int orderscnt(int type){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol()&&OrderType()==type && MagicNumber==OrderMagicNumber()){
cnt++;
}
}
}
return(cnt);
}
أول شرط سيكون حذف الأمر الليميت المعلق ووضع الأمر المعلق الأستوب
ستحتاج أولا عمل دالة لمعرفة قيمة ستوب الأمر المفتوح وحجم اللوت له
كود PHP:
double StopLossOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
return(OrderStopLoss());
}
}
return(0);
}
double LotsOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
return(OrderLots());
}
}
}
ودالة لحذف الأوامر المعلقه
كود PHP:
void DeletePendingOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
OrderDelete(OrderTicket());
}
}
}
ثم ستكون الشروط
كود PHP:
if(orderscnt(OP_BUY)>0&&orderscnt(OP_SELLSTOP)==0)
{
DeletePendingOrder(OP_SELLLIMIT);
OrderSend(Symbol(),OP_SELLSTOP,LotsOrder(OP_BUY)*2,StopLossOrder(OP_BUY),0,"EA",MagicNumber,0,Red);
}
if(orderscnt(OP_SELL)>0&&orderscnt(OP_BUYSTOP)==0)
{
DeletePendingOrder(OP_BUYLIMIT);
OrderSend(Symbol(),OP_BUYSTOP,LotsOrder(OP_SELL)*2,StopLossOrder(OP_SELL),0,"EA",MagicNumber,0,Blue);
}
أما بالنسبه لإلغاء الأوامر المعلقه في حال أغلقت الأوامر المفتوحه على هدفها
كود PHP:
if(orderscnt(OP_BUY)+orderscnt(OP_SELL)==0)
{
DeletePendingOrder(OP_BUYSTOP);
DeletePendingOrder(OP_SELLSTOP);
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
أنت شرحت الشروط بكل تفصيل باقي فقط أن تحويل هذه الأوامر إلى كود بنفس الطريقه التي شرحتها
قم بعمل دالة لمعرفة عدد الأوامر المعلقة حسب نوعها
كود PHP:
int orderscnt(int type){
int cnt=0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol()&&OrderType()==type && MagicNumber==OrderMagicNumber()){
cnt++;
}
}
}
return(cnt);
}
أول شرط سيكون حذف الأمر الليميت المعلق ووضع الأمر المعلق الأستوب
ستحتاج أولا عمل دالة لمعرفة قيمة ستوب الأمر المفتوح وحجم اللوت له
كود PHP:
double StopLossOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
return(OrderStopLoss());
}
}
return(0);
}
double LotsOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
return(OrderLots());
}
}
}
ودالة لحذف الأوامر المعلقه
كود PHP:
void DeletePendingOrder(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
OrderDelete(OrderTicket());
}
}
}
ثم ستكون الشروط
كود PHP:
if(orderscnt(OP_BUY)>0&&orderscnt(OP_SELLSTOP)==0)
{
DeletePendingOrder(OP_SELLLIMIT);
OrderSend(Symbol(),OP_SELLSTOP,LotsOrder(OP_BUY)*2,StopLossOrder(OP_BUY),0,"EA",MagicNumber,0,Red);
}
if(orderscnt(OP_SELL)>0&&orderscnt(OP_BUYSTOP)==0)
{
DeletePendingOrder(OP_BUYLIMIT);
OrderSend(Symbol(),OP_BUYSTOP,LotsOrder(OP_SELL)*2,StopLossOrder(OP_SELL),0,"EA",MagicNumber,0,Blue);
}
أما بالنسبه لإلغاء الأوامر المعلقه في حال أغلقت الأوامر المفتوحه على هدفها
كود PHP:
if(orderscnt(OP_BUY)+orderscnt(OP_SELL)==0)
{
DeletePendingOrder(OP_BUYSTOP);
DeletePendingOrder(OP_SELLSTOP);
}
إجابة شافية من عبقري البرمجة
ربنا يجزاك الف خير استاذ أسامة ويجعله بميزان حسناتك ان شاء الله
دائما أبدا ستظل استاذي ومرجعي في البرمجة