رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
سوف تقوم أولا بحفظ قيمة مكان سعر الخطوط الأساسي
كود 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);
}
}
هناك خطأ بالكود لان الخطوط تتحرك مع السعر وهذا غير مطلوب وايضا عند تحريك احد الخطوط يتنافر الخطين الى ان يختفوا
اظن ان الخطأ من قيمة diff حيث ان الكود الخاص بها
كود PHP:
Diff=MainPricehigh-CurrentH;
وهنا اذا كان main price اقل من الحالى ستكون النتيجة بالسالب
لذا قمت بتعديل الكود التالى
كود PHP:
double Diff;
if(MainPricehigh!=CurrentH&& MainPricehigh>CurrentH)
{
Diff=MainPricehigh-CurrentH;
}
else
if (MainPricehigh!=CurrentH&& MainPricehigh<CurrentH)
{
Diff=MainPricehigh+CurrentH;
ObjectSet("L",OBJPROP_PRICE1,CurrentL+Diff);
ولكن لا جديد
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
طبيعة الصفقات عند فتحها أنها ترتب من 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();
}
}
}
بارك الله فيك أستاذي
هل الأوامر المعلقة تدخل في ترتيب الصفقات يعني Type تنوب عن طبيعة الأمر كيفما كان ...
وكيف يمكن ترجمة هذا الكود بصفة عامة وسط مجموعة اوامر كثيرة منها المفعلة والمعلقة
يعني ليس شرط ان يكون البيع1 برقم1 و الشراء2 برقم2 بل الشرط أن يتحقق الترتيب فقط وسط مجموعة اوامر عديدة معلقة ومفعلة -- وعليه يتم معاينة الشرط القادم
كمثال
هذا الترتيب
لدينا بيع مفعل1 ثم يليه شراء معلق1 ثم يليه بيع مفعل 2 ثم بمجرد تفعيل الشراء2 تتحقق المعادلة
هو نفس الترتيب التالي
إذا وجد بيع مفعل 1 ثم يليه شراءمفعل1 ثم يليه بيع مفعل 2 ثم يليه شراء معلق2 ثم يليه بيع مفعل 3 ثم بمجرد تفعيل الشراء3 تتحقق المعادلة
وهكذا كيف يمكن ترجمتها بصفة عامة ...
أو ربما لم أفهم مشاركتك بالشكل المطلوب... ياريت شرح مفصل وآسف على الاطالة
وشكرا جزيلا أستاذي الغالي :eh_s(7):
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة العوامى
هناك خطأ بالكود لان الخطوط تتحرك مع السعر وهذا غير مطلوب وايضا عند تحريك احد الخطوط يتنافر الخطين الى ان يختفوا
اظن ان الخطأ من قيمة diff حيث ان الكود الخاص بها
كود PHP:
Diff=MainPricehigh-CurrentH;
وهنا اذا كان main price اقل من الحالى ستكون النتيجة بالسالب
لذا قمت بتعديل الكود التالى
كود PHP:
double Diff;
if(MainPricehigh!=CurrentH&& MainPricehigh>CurrentH)
{
Diff=MainPricehigh-CurrentH;
}
else
if (MainPricehigh!=CurrentH&& MainPricehigh<CurrentH)
{
Diff=MainPricehigh+CurrentH;
ObjectSet("L",OBJPROP_PRICE1,CurrentL+Diff);
ولكن لا جديد
غير تعريف المتغيرات
كود PHP:
double MainPricehigh,MainPricelow;
إجعلها
كود PHP:
static double MainPricehigh,MainPricelow;
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة kira-h
بارك الله فيك أستاذي
هل الأوامر المعلقة تدخل في ترتيب الصفقات يعني Type تنوب عن طبيعة الأمر كيفما كان ...
وكيف يمكن ترجمة هذا الكود بصفة عامة وسط مجموعة اوامر كثيرة منها المفعلة والمعلقة
يعني ليس شرط ان يكون البيع1 برقم1 و الشراء2 برقم2 بل الشرط أن يتحقق الترتيب فقط وسط مجموعة اوامر عديدة معلقة ومفعلة -- وعليه يتم معاينة الشرط القادم
كمثال
هذا الترتيب
لدينا بيع مفعل1 ثم يليه شراء معلق1 ثم يليه بيع مفعل 2 ثم بمجرد تفعيل الشراء2 تتحقق المعادلة
هو نفس الترتيب التالي
إذا وجد بيع مفعل 1 ثم يليه شراءمفعل1 ثم يليه بيع مفعل 2 ثم يليه شراء معلق2 ثم يليه بيع مفعل 3 ثم بمجرد تفعيل الشراء3 تتحقق المعادلة
وهكذا كيف يمكن ترجمتها بصفة عامة ...
أو ربما لم أفهم مشاركتك بالشكل المطلوب... ياريت شرح مفصل وآسف على الاطالة
وشكرا جزيلا أستاذي الغالي :eh_s(7):
:00012:
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
سوف تضيف دالة حساب حجم اللوت
كود PHP:
double LotManage()
{
double lot = MathCeil(AccountFreeMargin() * RiskPercent / 1000) / 100;
if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Symbol(),MODE_MINLOT);
if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Symbol(),MODE_MAXLOT);
return (lot);
}
ويمكنك تحديد تفعيلها أو تعطيلها من الخيارات
كود PHP:
extern bool UseMoneyManagement = false;
extern int RiskPercent = 10;
وشرط حساب حجم اللوت الجديد في حال الخساره
كود PHP:
if(LastOrderProfit()<0)
Lots=MathMax(LastOrderLot()/5,MarketInfo(Symbol(),MODE_MINLOT));
استاد MR.dollar في هدا الكود قمت بتعديل 5/ إلى 2* . لكني أريد. إذا وصل الى 10 صفقات خاسرة متتالية يتوقف عن المضاعفة ويعود إلى lot ألأول وشكرا لك
ولك جزير الشكر
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة kira-h
بارك الله فيك أستاذي
هل الأوامر المعلقة تدخل في ترتيب الصفقات يعني Type تنوب عن طبيعة الأمر كيفما كان ...
وكيف يمكن ترجمة هذا الكود بصفة عامة وسط مجموعة اوامر كثيرة منها المفعلة والمعلقة
يعني ليس شرط ان يكون البيع1 برقم1 و الشراء2 برقم2 بل الشرط أن يتحقق الترتيب فقط وسط مجموعة اوامر عديدة معلقة ومفعلة -- وعليه يتم معاينة الشرط القادم
كمثال
هذا الترتيب
لدينا بيع مفعل1 ثم يليه شراء معلق1 ثم يليه بيع مفعل 2 ثم بمجرد تفعيل الشراء2 تتحقق المعادلة
هو نفس الترتيب التالي
إذا وجد بيع مفعل 1 ثم يليه شراءمفعل1 ثم يليه بيع مفعل 2 ثم يليه شراء معلق2 ثم يليه بيع مفعل 3 ثم بمجرد تفعيل الشراء3 تتحقق المعادلة
وهكذا كيف يمكن ترجمتها بصفة عامة ...
أو ربما لم أفهم مشاركتك بالشكل المطلوب... ياريت شرح مفصل وآسف على الاطالة
وشكرا جزيلا أستاذي الغالي :eh_s(7):
نعم ستدخل الأوامر المعلقه في الترتيب أيضا وهذا الكود سيعمل مهما كان عدد الأوامر وإختلافها لكن لو مثلا أريد أن أحسب إذا كان الأمر بيع أو بيع معلق فيحسب رقمه سوف تجعل الشرط
كود PHP:
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderType()==OP_BUY||OrderType()==OP_BUYSTOP)
في المثال الأول الذي ذكرته عندما تتفعل صفقة البيع المعلقه فسوف يصبح رقمها هو 2 كما هي والشراء رقمه 1 و 3
لو مثلا تريد تحقيق المعادله التي تريدها سأقوم بعمل دالة تعود بنوع الصفقة حسب ترتيبها
مثال
كود PHP:
int NumType(int Num)
{
for(int i=0;i<OrdersTotal();i++)
{
int OrderNumber;
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
OrderNumber++;
if(OrderNumber==Num)
{
return(OrderType());
}
}
}
return(-1);
}
ثم ستصبح الشروط
كود PHP:
if(NumType(0)==OP_SELL&&NumType(1)==OP_BUY&&NumType(2)==OP_SELL)
{
// do something
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة العوامى
شكرا مستر دولار
التعديل زبط واصبحت الخطوط لا تتحرك مع السعر
ولكن مازالت مشكلة تنافر الخطوط قائمة حيث عند تحريك احد الخطوط يتنافر معه الخط الاخر الى ان يبتعد الاثنان كثيرا
أليس هذا المطلوب أن تتحرك مقدار نفس النقاط التي تم تحريكها ؟
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة dentist_hussein
السلام عليكم أستاذ أسامه .. كنت أريد داله تقوم بحساب الربح المحقق بصفقات تم إغلاقها و الربح العائم و الخساره العائمه للصفقات الحاليه المفتوحه و أقوم بحساب إجمالي الربح بنسبه مئويه من الرصيد الإبتدائي لإغلاق الصفقات عند الوصول لهذه النسبه المئويه و تصبح من الرصيد ثم البدأ من جديد ..
و جزاك الله كل خير
وعليكم السلام ورحمة الله وبركاته
سوف تحتاج لمعرفة توقيت بدأ فتح أول صفقة حتى يبدأ الحساب من عندها للصفقات التي أغلقت لذلك ضع في كود أمر فتح أول صفقه عند فتح مثلا أول صفقة شراء
كود PHP:
FirstOrderTime=TimeCurrent;
وأيضا متغير لمعرفة الرصيد الحالي كم عند فتح أول صفقه
كود PHP:
CurrentBalance=AccountBalance();
وتقوم بتعريف المتغير FirstOrderTime و CurrentBalance خارج الداله start
الآن ستستخدم نفس الدالة التي تحسب ربح الصفقات مره للصفقات المغلقه والصفقات المفتوحه
كود PHP:
double CurrentProfit()
{
double Profit;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
Profit+=OrderProfit();
}
}
return(Profit);
}
double ClosedProfit()
{
double Profit;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber&&OrderOpenTime()>=FirstOrderTime)
{
Profit+=OrderProfit();
}
if(OrderOpenTime()<FirstOrderTime)break;
}
return(Profit);
}
ثم ستحسب النسبه المئويه بدون مشاكل
كود PHP:
if((CurrentProfit()+ClosedProfit())/CurrentBalance*100>=PercentProfit)
{
// close all
}
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة zzeyani
استاد MR.dollar في هدا الكود قمت بتعديل 5/ إلى 2* . لكني أريد. إذا وصل الى 10 صفقات خاسرة متتالية يتوقف عن المضاعفة ويعود إلى lot ألأول وشكرا لك
ولك جزير الشكر
ستقوم بعمل دالة لحساب عدد الصفقات الخاسره المتتاليه
كود PHP:
int LostOrderNumber()
{
int count;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderProfit()<0)count++
else return(count);
}
}
return(count);
}
ثم ستضع الشرط
كود PHP:
if(LostOrderNumber>=10)Lots=FirstLot;
1 مرفق
رد:موضوع مخصص للأسئلة البرمجية
اقتباس:
المشاركة الأصلية كتبت بواسطة MR.dollar
ستقوم بعمل دالة لحساب عدد الصفقات الخاسره المتتاليه
كود PHP:
int LostOrderNumber()
{
int count;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderProfit()<0)count++
else return(count);
}
}
return(count);
}
ثم ستضع الشرط
كود PHP:
if(LostOrderNumber>=10)Lots=FirstLot;
هل يمكنك أن تقوم بتعديله على هدا السكريبت . مع خالص الشكر لك و لطاقم المنتدى