وعليكم السلام ورحمة الله وبركاته
مقترحك ممتاز جدا لكن نسبة المهتمين بها سيكون قليل جدا للاسف في الوقت الحالي
Printable View
هذه هي الObjects التي تقوم برسم الدوائر على الشارت
الملف المرفق 520941
كما تلاحظ الإسم العام لها هو PERFZONES_SRZHLL بالتالي يمكنك البحث في جميع الObjects الموجوده على الشارت ولها هذا الإسم
مثال
كود PHP:for(int i=ObjectsTotal()-1;i>=0;i--)
{
string name=ObjectName(i);
if(StringFind(name,"PERFZONES_SRZHLL",0)>=0)
{
datetime time=ObjectGet(name,OBJPROP_TIME1);
double price=ObjectGet(name,OBJPROP_PRICE1);
if(time==Time[1])
{
//do something
}
}
}
ستصل
لكي تفهمها جرب الكود من دون وجود OrderSelect
هذه دالة اجبارية --لانك تريد ان تتعامل مع امر, وبالتالي لابد ان تختاره او تحدده--ولايمكن ذلك الا من خلال OrderSelect
اذا حددته بشكل دقيق -- اصبح السيرفر مثلا علم اي امر تريد اغلاقه او حذفه او تعديل التيك بروفت له او معرفة ربحه او اسم الزوج او نوع الامر وهلم جراً.
وبناء على هذا الكلام هي تتعامل مع اوامر موجودة مسبقاً
اقرا بين السطور---جميع الدوال المحوطة باالأحمر لايمكن ان تعرفها او تتعامل معها--لأنها كلها تتحدث عن أمر جاهز وموجود مسبقاً, الا اذا حددت الأمر بدالة OrderSelect
الملف المرفق 521045
السلام عليكم
لو ممكن سؤال برمجى
الان هذه الدالة تظهر لى رقم التكيت الى اكبر خسارة
المطلوب الان معرفة رقم التكيت للصفقة اقل خسارة من الاكبر خسارة
وشكرا على المساعدة
كود PHP:int Tick_A_L(int Type){ int i,ticket=0; double max=0; RefreshRates(); for(i=0;i<OrdersTotal();i++){ if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){RefreshRates();return false;} if(OrderSymbol()==Symbol()&&OrderType()==Type&&OrderMagicNumber()==MagicNumber){ if(OrderProfit()<max){max=OrderProfit();ticket=OrderTicket();} } } return(ticket);}
الكود ملتبس شوي,
هل تريد اخي ترتيب التكتات في جدول مثلا, من الاكبر خسارة الى الاصغر خسارة لزوج محدد في اتجاه محدد؟
ام تريد رقم تكت ثاني اسؤا صفقة.
ملاحظة-1: RefreshRates() لاداعي لاستخدامها لانها مجرد تحديث للمعطيات الشهيرة لكل الأزواج وانت هنا تتعامل مع قيم OnAccount Events --مثل تغير الربح والخسارة وليس الأسعار--يعني يستحسن عدم استخدامها الا مع الدخول ماركت ordersend او الاغلاق ماركت او الموديفاي في حالات خاصة جدا
ملاحظة-2: اللووووب بدأته من 0 الى اخر اورود OrdersTotal-1
ويفترض تبدأه بالعكس مع دكرمنت i--
ليش؟كود:for(OrdersTotal()-1;i>=0;i--)
لأنك في الحالة الأولى لو صادف واغلق صفقة لاي سبب اخر بماجك نمبر اخر اثناء اللوب , فإنه سيقفز صفقة ولن يراها اللوووب
ولكن الحالة الأخيرة امنة ضامنة للمرور على كل الصفقات--تأخذها من فوق الى تحت
+ اسرع للبرنامج لأن دالة OrderTotal في حالتي يستدعيها البرنامج مرة واحدة
في حالتك يستدعيها البرنامج مرات كثيرة تساوي عدد الاوردرز
ملاحظة-3: orderelct المنفية وإعادة false الخ
تصور لاي سبب اخر, فشل اختيار احد الأوامر --لن يكمل اللوب!!
والافضل حسب وجهة تظري, orderselect كبلوك لبقية الكود
كود:int MagicNumber;
int Tick_A_L(int Type)
{
int ticket=0;
int ticketSecond=0;
double max=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderType()==Type&&OrderMagicNumber()==MagicNumber)
{
if(OrderProfit()<max)
{
ticketSecond=ticket;
ticket=OrderTicket();
max=OrderProfit();
}
}
}
}
Print(ticketSecond+" "+ticket);
return(ticket);
}
السلام عليكم اخى الكريم
شكرا على المساعدة
الان الدالة الخاص بيك تظهر لى رقم تكيت اكبر خسارة
المطلوب هو دالة تظهر لى رقم تكيت الاخسارة الاقل من الاولى
بمعنى الدالة الخاص بيك
تظهر اكبر خسارة مثلا -100
يوجد صفقة ايضا خاسرة -90
وصفقة خاسرة -80
انا اريد دالة تظهر لى تكيت الخسارة الاقل من الاخير وهى -90
اعتقد كده وضحت الفكرة
وشكرا على المساعدة
نعم وضحت جدا اخي
في هذه الحالة في ال return
ضع ticketSecond بدلا من ticket
لانه المتغير الذي يحقظ القيمة السابقة ل تكت لو جد فعلا ان هناك صفقة اكبر خسارة مما سبق.
واذا كنت تريد إعادة القيمتين! -- هيكلة الدالة تتغير--لابد تخليها كحل م نضمن عدة حلول من نوع void
والمتغيرين تخليهم global (خارج الدوال) مع تصفير قيمهم اثناء دخول الدالة وقبل اللووووووووووبنق
انا افضل -1 بدلا من 0 (التصفير) لتكتات الأوامر عند الأنشلة.
اذا كنت تريد تكرار الامر لكل الصفقات هناك مفهوم الريكيرشن recursion في البرمجة ولابد من مصفوفة
-
حفظنا القيمة السابقة قبل تغييرهااقتباس:
ticketSecond=ticket;
ticket=OrderTicket();
لو بدلت السطرين مكان بعض
سيكون نفس القيمة الأخيرة--زي بعض---ننتبه لهذه الامور
سمير ما فائدة معرفة ثاني اسؤا صفقة؟
قد اتفهم اسؤا صفقة ولكن ثاني صفقة--لماذا؟
اكيد لديك هدف منها
كود سورتنق لصفقات منتقاة لزوج محدد باتجاه محدد بماجك نمبر محدد
وبالتالي اسؤا صفقة هي بـ ـتكت في الاندكس m يعني التكت tick[m]كود:int MagicNumber=0;
int tick[];
double LossInUSD[];
void Tick_A_L(int Type)
{
ArrayResize(tick,0);
ArrayResize(LossInUSD,0);
int ordTotal=OrdersTotal();
int m=-1;
for(int k=0;k<ordTotal;k++)
{
if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol()&&OrderType()==Type&&OrderMagicNumber()==MagicNumber)
{
m++;
ArrayResize(tick,m+1);
ArrayResize(LossInUSD,m+1);
tick[m]=OrderTicket();
LossInUSD[m]=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
for(int i=0;i<m;i++)
{
for(int j=i+1;j<=m;j++)
{
if(LossInUSD[i]<LossInUSD[j])
{
int temp=tick[i];
tick[i]=tick[j];
tick[j]=temp;
double temd=LossInUSD[i];
LossInUSD[i]=LossInUSD[j];
LossInUSD[j]=temd;
}
}
}
for(int n=0;n<=m;n++)
{
Print(n," ",tick[n]," ",LossInUSD[n]);
}
}
int OnInit()
{
Tick_A_L(OP_BUY);
return(INIT_SUCCEEDED);
}
void OnTick()
{
}
وثاني اسؤا صفقة تكت في اندكس رقم m-1
وثالث اسؤا صفقة بتكتب بالاندكس رقم m-2
وهكذا
صورة توضح ناتج البرنامج:
الملف المرفق 521252
داخل if لو عكست اصغر من > الى اكبر من < ----- تصبح الامور اسهل تصبح اسواء صفقة في الاندكس رقم 0 و ليس m ---- m هي اخر اندكس لاخر عنصر في المصفوفة
وهكذا
حيث طول المصفوفة m+1