رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة العوامى
استاذ اسامة
اصنع اكسبيرت يقوم برسم خطين واحد اعلى السعر وواحد اسفل السعر ويقوم بتعليق اوامر على الخطوط ويمكن تحريك الخطوط لتتحرك معه الاوامر المعلقة
تم عمل الكود اللازم لذلك ولكن هناك شئ ناقص لم استطيع حله برمجيا وهو عند تحريك احد الخطوط يتحرك معه الخط الاخر تلقائيا وتكون المسافة بينهما ثابتة فهل هناك كود او دالة تقوم بذلك مع العلم بانى حاولت عمل ذلك من خلال دالة void واوامر object move ولكن لم اصل لشئ
للتذكير
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة abou fares
شكرا والف شكر لك مستر دولار انا اريد معرفة بالتحديد ماهي المعادلة او الكود التي سنستخدمها في اي مؤشر لتحويل اشارته من يوم واحد لجميع الايام السابقة وشكرا ارجوا ان اكون قد استطعت اصال الفكرة واذا ممكن ان تعلم بالون الاحمر الجزء الذي وضعته في المؤشرات الهيستوريكال لكي تصبح هيستوريكال وشكرا
مثلا مؤشر يقوم برسم خط أفقي على سعر الإفتتاح
كود PHP:
ObjectCreate("line",OBJ_HLINE,0,Time[0],Open[0]);
ObjectSet("line",OBJPROP_COLOR,Red);
ObjectSet("line",OBJPROP_WIDTH,1);
أريد تحويل هذا الكود إلى رسم خط عند الإفتتاح لآخر عشر أيام سابقه مثلا
فبدلا من إستخدام OBJ_HLINE سوف أستخدم OBJ_TREND وسوف أحدد سعر البدايه و النهايه والتوقيت
مثل
كود PHP:
for(int i=0;i<10;i++)
{
ObjectCreate("line"+i,OBJ_TREND,0,iTime(Symbol(),1440,i),Open[i],iTime(Symbol(),1440,i)+3600*24,Open[i]);
ObjectSet("line"+i,OBJPROP_COLOR,Red);
ObjectSet("line"+i,OBJPROP_WIDTH,1);
ObjectSet("line"+i,OBJPROP_RAY,false);
}
وسوف تختلف الطريقه حسب الكود نفسه فكما ذكرت سابقا لكل مؤشر حسب طريقة برمجته سوف أقوم بتعديله ليصبح تاريخي
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة العوامى
للتذكير
التعديل من الكود نفسه إجعل الإكسبرت لا يقوم برسم الخطوط أو تحريكها بعد أول مره يتم وضعها على الشارت بالتالي كلما حركتها يدويا لن يتغير مكان الخط الثابت
أرفق الكود و سوف أوضح لك أين المشكله
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
السلام عليكم أستاذي العزيز
أنا أستخدم الداله التي تفضلت بها في مشاركة سابقه لحساب نقطه التعادل
كود PHP:
double BreakPoint(int type )
{
double Price;double Lots;
for(int i=0;i<=OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber && OrderType()==type )
{
Price+=OrderOpenPrice()*OrderLots();
Lots+=OrderLots();
}
}
if(Lots!=0) return(Price/Lots);
}
و أقوم بوضع شرط لغلق الصفقات المفتوحه إذا كانت صفقتان فأكثر بحيث تغلق على نقطة التعادل و زيادة 10 نقاط
كود PHP:
while ( orderscnt(OP_BUY) >1 && Bid >=BreakPoint(OP_BUY)+10*point ) {CloseBuyOrders() ; if (orderscnt(OP_BUY)==0) break ; }
while ( orderscnt(OP_SELL) >1 && Bid <=BreakPoint(OP_SELL)-10*point ) {CloseSellOrders() ; if (orderscnt(OP_SELL)==0) break ; }
و لكن في معظم الأحيان لا يتم إغلاق الصفقات كما بالشرط و تغلق على أهدافها رغم مرورها بنقطة التعادل طالما وصلت للأهداف لأنها تكون صفقات تبريد من نفس النوع و يتم دائما تعديل هدف كل صفقه ليصبح أهداف الصفقات الجديدة هدف آخر صفقه مفتوحه ..
فهل هناك خطأ ... و جزاك الله خيرا .
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
وعليكم السلام ورحمة الله وبركاته
الشروط لديك صحيحه فربما الخطأ موجود في جزء آخر في الكود
إستخدم أيضا الأمر print او comment لمعرفة قيمة الداله BreakPoint وهل تعطي قيم صحيحه أو لا فإذا كانت القيم صحيحه عندها تنتقل إلى جزء آخر في الكود لمعرفة الخطأ
رجاء أستاذي العزيز لو تطلع على أكواد الاكسبيرت لتوضح لي الخطأ لأني لم أصل إليه ... ربما حسابات اللوت الموجودة بالاكسبيرت أو ترتيب الأكواد هي السبب لكني لم أصل للسبب ..
جزاك الله خيرا
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
رجاء أستاذي العزيز لو تطلع على أكواد الاكسبيرت لتوضح لي الخطأ لأني لم أصل إليه ... ربما حسابات اللوت الموجودة بالاكسبيرت أو ترتيب الأكواد هي السبب لكني لم أصل للسبب ..
جزاك الله خيرا
طريقة كتابتك للشرط خاطئه
كود PHP:
while ( orderscnt(OP_BUY) >1 && Bid >=BreakPoint(OP_BUY)+10*point )
لأنك في هذه الحاله إذا كان الصفقات المفتوحه مثلا 2 بالتالي سوف يغلق الإكسبرت صفقة واحده ثم لن يتحقق الشرط فلن يغلق الصفقه الثانيه
أيضا كان يظهر خطأ إعادة تسعير في حال كان البروكر 5 أرقام عشرية لذلك عدل عدد نقاط إعادة التسعير في دالة الإغلاق لتصبح 30 مثلا في حال ال5 أرقام بروكر
مرفق الإكسبرت بعد التعديل
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
التعديل من الكود نفسه إجعل الإكسبرت لا يقوم برسم الخطوط أو تحريكها بعد أول مره يتم وضعها على الشارت بالتالي كلما حركتها يدويا لن يتغير مكان الخط الثابت
أرفق الكود و سوف أوضح لك أين المشكله
كود PHP:
extern int takeprofit=10;
extern int stoploss=10;
extern int slip=3;
extern string c="";
extern int magic=10;
extern double lot=10;
color HighColor=Green;
color LowColor=Red;
int Width=1;
int up=20;
int dw=20;
int t;
//+--------
int init() {
return(0);
}
//+----
int deinit() {
ObjectDelete("L");
ObjectDelete("H");
Comment("");
return(0);
}
//+------------------------------------------------------------------+
int start() {
t=1; if(Digits==5||Digits==3){t=10;}
if(Width>5||Width<1)Width=1;
double hight=Bid+up*Point;
double low=Bid-dw*Point;
double medium=(hight+low)/2;
draw("L",low,LowColor);
draw("H",hight,HighColor);
if (Bid>hight) OrderSend(NULL,OP_BUY,lot,Ask*Point*t,slip,Ask-stoploss,Ask+takeprofit,c,magic,0,Blue);
if (Bid>hight) OrderSend(NULL,OP_BUY,lot,Bid*Point*t,slip,Bid-stoploss,Bid+takeprofit,c,magic,0,Red);
return(0);
}
void draw(string name, double price,color _Color)
{
if(ObjectFind(name) != 0)
{
ObjectCreate(name, OBJ_HLINE, 0, 0,price);
ObjectSet(name, OBJPROP_COLOR, _Color);
ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(name, OBJPROP_WIDTH, Width);
}
}
//+------------------------------------------------------------------+
مرفق الكود
وما اريد فعله هو عند تحريك احد الخطين يتحرك معه الخط الاخر تلقائيا بمعنى الاكسبيرت عند وضعه على الشارت يقوم برسم خط اعلى السعر وخط اسفل السعر بمقدار من النقاط وعند تحريك احد الخطين يتحرك معه الخط الاخر
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
طريقة كتابتك للشرط خاطئه
كود PHP:
while ( orderscnt(OP_BUY) >1 && Bid >=BreakPoint(OP_BUY)+10*point )
لأنك في هذه الحاله إذا كان الصفقات المفتوحه مثلا 2 بالتالي سوف يغلق الإكسبرت صفقة واحده ثم لن يتحقق الشرط فلن يغلق الصفقه الثانيه
أيضا كان يظهر خطأ إعادة تسعير في حال كان البروكر 5 أرقام عشرية لذلك عدل عدد نقاط إعادة التسعير في دالة الإغلاق لتصبح 30 مثلا في حال ال5 أرقام بروكر
مرفق الإكسبرت بعد التعديل
جزاك الله كل خير أستاذي العزيز و بارك في علمك و عمرك .
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
وعليكم السلام ورحمة الله وبركاته
أعطني مثال تفصيلي أكثر حتى أستطيع أن أجيبك بارك الله فيك
بارك الله فيك
دي مشكلتي الشرح السيء وأصلا المثال السابق خاطئ!
المهم أستاذي أريد معرفة كيف يمكننا تحديد تراتبية الصفقات
يعني مثلا أعرف الصفقة دي شراء الأولى ودي البيع التانية وهكذا ... هل نستخدم شرط التوقيت ؟!!! وكيف ذلك ؟ أم هناك طريقة أفضل وسهلة
أيضا مشكلة تحديد الربح الاجمالي
بطريقتي غلق البيع مع الشراء ليست كغلق الشراء مع البيع بهذا الترتيب رغم أن لهما نفس الربح الاجمالي
لذلك أريد كيفية تحديد تراتبية الصفقات ثم ندمجها مع الربح الاجمالي بالترتيب الذي أريده
الترتيب مهم جدا
منتظرك أستاذي وياريت لو شرح تفصيلي للأكواد المطلوبة
والله يجزاك عنا كل خير
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة العوامى
ما اريده هو عندما اقوم بتحريك احد الخطوط يدويا على الشارت يتحرك معه الخط الاخر تلقائيا بحيث تكون المسافة بين الخطين ثابته بمعنى اخر لدينا على الشارت خط اسمه ج وخط اسمه د والمسافة بينهما 20 نقطة وعندما اقوم بتحريك الخط ج لاعلى او لاسفل يدويا يتحرك معه الخط د بنفس مقدار الحركة تلقائيا
سوف تقوم أولا بحفظ قيمة مكان سعر الخطوط الأساسي
كود PHP:
double MainPricehigh,MainPricelow;
if(MainPricehigh==0)
{
MainPricehigh=hight;
MainPricelow=low;
}
ثم نريد الآن معرفة سعر الخطوط الحاليه وسوف نضع شرط إذا كان سعر الخط الحالي أكبر من السعر الأساسي فيقوم بتغيير سعر الخط الآخر بنفس مقدار النقاط
مثال
كود PHP:
double CurrentH=ObjectGet("H",OBJPROP_PRICE1);
double CurrentL=ObjectGet("L",OBJPROP_PRICE1);
double Diff;
if(MainPricehigh!=CurrentH)
{
Diff=MainPricehigh-CurrentH;
ObjectSet("L",OBJPROP_PRICE1,CurrentL+Diff);
MainPricehigh=hight;
MainPricelow=low;
}
if(MainPricelow!=CurrentL)
{
Diff=MainPricelow-CurrentL;
ObjectSet("H",OBJPROP_PRICE1,CurrentH+Diff);
MainPricehigh=hight;
MainPricelow=low;
}
الكود بشكل كامل سيكون
كود PHP:
int start() {
t=1; if(Digits==5||Digits==3){t=10;}
if(Width>5||Width<1)Width=1;
double hight=Bid+up*Point;
double low=Bid-dw*Point;
double CurrentDiffhigh=
double medium=(hight+low)/2;
double MainPricehigh,MainPricelow;
if(MainPricehigh==0)
{
MainPricehigh=hight;
MainPricelow=low;
}
double CurrentH=ObjectGet("H",OBJPROP_PRICE1);
double CurrentL=ObjectGet("L",OBJPROP_PRICE1);
double Diff;
if(MainPricehigh!=CurrentH)
{
Diff=MainPricehigh-CurrentH;
ObjectSet("L",OBJPROP_PRICE1,CurrentL+Diff);
MainPricehigh=hight;
MainPricelow=low;
}
if(MainPricelow!=CurrentL)
{
Diff=MainPricelow-CurrentL;
ObjectSet("H",OBJPROP_PRICE1,CurrentH+Diff);
MainPricehigh=hight;
MainPricelow=low;
}
draw("L",low,LowColor);
draw("H",hight,HighColor);
if (Bid>hight) OrderSend(NULL,OP_BUY,lot,Ask*Point*t,slip,Ask-stoploss,Ask+takeprofit,c,magic,0,Blue);
if (Bid>hight) OrderSend(NULL,OP_BUY,lot,Bid*Point*t,slip,Bid-stoploss,Bid+takeprofit,c,magic,0,Red);
return(0);
}
void draw(string name, double price,color _Color)
{
if(ObjectFind(name) != 0)
{
ObjectCreate(name, OBJ_HLINE, 0, 0,price);
ObjectSet(name, OBJPROP_COLOR, _Color);
ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(name, OBJPROP_WIDTH, Width);
}
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة kira-h
بارك الله فيك
دي مشكلتي الشرح السيء وأصلا المثال السابق خاطئ!
المهم أستاذي أريد معرفة كيف يمكننا تحديد تراتبية الصفقات
يعني مثلا أعرف الصفقة دي شراء الأولى ودي البيع التانية وهكذا ... هل نستخدم شرط التوقيت ؟!!! وكيف ذلك ؟ أم هناك طريقة أفضل وسهلة
أيضا مشكلة تحديد الربح الاجمالي
بطريقتي غلق البيع مع الشراء ليست كغلق الشراء مع البيع بهذا الترتيب رغم أن لهما نفس الربح الاجمالي
لذلك أريد كيفية تحديد تراتبية الصفقات ثم ندمجها مع الربح الاجمالي بالترتيب الذي أريده
الترتيب مهم جدا
منتظرك أستاذي وياريت لو شرح تفصيلي للأكواد المطلوبة
والله يجزاك عنا كل خير
طبيعة الصفقات عند فتحها أنها ترتب من 0 إلى عدد الصفقات فما يمكنك عمله هو إستخدام عدد بحيث كلما يمر على الصفقة لنفس النوع يزيد الرقم +1 بالتالي هذا سيكون هو ترتيبها
مثال
كود PHP:
void NumCounter(int type)
{
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
OrderNumber++;
Print("order with ticket "+OrderTicket()+" Number "+OrderNumber);
}
}
}
كمثال أريد ترتيب الصفقات في مصفوفه بحيث أحفظ رقم التيكيت لها من الأقدم للأحدث
سيكون الكود
كود PHP:
void NumCounter(int type)
{
int ArrayTicket[];
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==type)
{
OrderNumber++;
ArrayResize(ArrayTicket,OrderNumber);
ArrayTicket[OrderNumber-1]=OrderTicket();
}
}
}