النتائج 1 إلى 8 من 8
- 23-04-2009, 10:54 AM #1
كيف يمكن معالجة الرقم العشري الزايد في الأسعار
زي ما إنتم عارفين إنهم أضافوا رقم عشري للأسعار مثل 98.10 إلى 98.100 أو 0.9999 إلى 0.99990
فما هو الكود لإسترجاع الرقم المكون من ثلاث أرقام عشرية إلى رقمين عشريين
~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~5~~~ ~~~~ ~~~ ~~4 أرقام
وشكرا مقدما
- 23-04-2009, 10:38 PM #2
رد: كيف يمكن معالجة الرقم العشري الزايد في الأسعار
هناك عدة طرق وما أستخدمه منها شخصيا وقد لا تكون الطريقة الأفضل كما يلي:
أضف المتحول العام التالي (قبل وظائف int و deint و start )
كود:double Poin;
كود:if (Point == 0.00001) Poin = 0.0001; //6 digits else if (Point == 0.001) Poin = 0.01; //3 digits (for Yen based pairs) else Poin = Point; //Normal
اضغط زر كومبايل طبعا.
مثال تطبيقي:
كود://+------------------------------------------------------------------+ //| abdullah_st.mq4| //| | //+------------------------------------------------------------------+ #property copyright "abdullah_st" #property link "None" //------------------------------- #include <stdlib.mqh> #include <stderror.mqh> //------------------------------- extern int Slippage=3; extern int MagicNumber = 23215650; extern int TimeFrame = 0;// Optimize per currency pair. current=0 , M1=1, M5=5, M15=15, // M30=30, H1=60, H4=240, Daily=1440 //------------------------------- extern bool MM=true;//Select true for automatic money management extern int RiskPercent=1;//Update per your desired risk extern double Lots=0.1;//Optimize per account balance extern int MaxTrades=1; //---------------------- extern int StopLoss=25; //Optimize per currency pair and timeframe extern int TakeProfit = 100; //Optimize per currency pair and timeframe //-------------------------------- extern bool TrailingAlls = true; extern int Trail = 25; //Optimize per currency pair and timeframe extern int TrailStart = 5; //Optimize per currencypair and timeframe //---------------------- extern bool BreakEven = true; extern int BreakEvenTrigger = 25; //------------------ extern int TTFbars=15;//15=default number of bars for computation extern int TopLine=50; extern int BottomLine=-50; extern int t3_period=5; extern double b=0.7; //---------------- double Poin; // global variable declaration to fix the 6 Digit Forex Quotes //issue for MetaTrader Expert Advisors string EA_Name = "abdullah_st"; bool AlertOn = true; datetime timeprev=0;//Working only after a new candle. //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //Initialization to Check for unconventional Point digits number if (Point == 0.00001) Poin = 0.0001; //6 digits else if (Point == 0.001) Poin = 0.01; //3 digits (for Yen based pairs) else Poin = Point; //Normal for 5 & 3 Digit Forex Quotes return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Money Mangement and Lot Optimization | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; //------ get broker's min/max double MinLots = NormalizeDouble((MarketInfo(Symbol(), MODE_MINLOT)),2); double MaxLots = NormalizeDouble((MarketInfo(Symbol(), MODE_MAXLOT)),2); //------ automatically select lot size per MM if (MM) lot=NormalizeDouble(MathFloor(AccountFreeMargin()*RiskPercent/100)/100,1); //------ make lots automatically per broker's min/max if (lot < MinLots) lot=MinLots; if (lot > MaxLots) lot=MaxLots; return(lot); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //+------------------------------------------------------------------+ //| Function calls | //+------------------------------------------------------------------+ if (TrailingAlls) Trailingalls(TrailStart, Trail); //------------------------------------ if (BreakEven) Breakeven(); //------------------------------------------------------------------+ //| Working only at a new candle rather than at every tick | //+------------------------------------------------------------------+ if(timeprev==Time[0])//Time[0] is time of the cuurent bar return(0); timeprev=Time[0]; //This means instead of working (ie moving TSL) after every tick, work only after //a new candle. //it makes testing faster and test profit results higher. //It means you can use your code only once for each bar, usually first tick. //Any other tick code doesn't work. Sometimes it is very usefull. //Any action in start function afer this code will be performed once within the Bars //regardless of the time you specify //+------------------------------------------------------------------+ //| indicators | //+------------------------------------------------------------------+ double cMainBuffer = iCustom(NULL,TimeFrame,"ttf", TTFbars, TopLine, BottomLine, t3_period, b, /*number of the data buffer*/0,/*shift*/1); double cSignalBuffer = iCustom(NULL,TimeFrame,"ttf", TTFbars, TopLine, BottomLine, t3_period, b, /*number of the data buffer*/1,/*shift*/1); double pMainBuffer = iCustom(NULL,TimeFrame,"ttf", TTFbars, TopLine, BottomLine, t3_period, b, /*number of the data buffer*/0,/*shift*/2); double pSignalBuffer = iCustom(NULL,TimeFrame,"ttf", TTFbars, TopLine, BottomLine, t3_period, b, /*number of the data buffer*/1,/*shift*/2); //+------------------------------------------------------------------+ //| implementing exit signals | //+------------------------------------------------------------------+ //------------- Closing Buy -------------------- if(cMainBuffer>cSignalBuffer) if(pMainBuffer<pSignalBuffer) if(CountLongs()>0) { CloseLongs(); { if (AlertOn) { Alert( " "+Symbol()+" M"+Period()+": Signal to SHORT. BUY order has been closed"); AlertOn = false; } } } //------------- Closing Sell -------------------- if(cMainBuffer<cSignalBuffer) if(pMainBuffer>pSignalBuffer) if(CountShorts()>0) { CloseShorts(); { if (AlertOn) { Alert( " "+Symbol()+" M"+Period()+": Signal to LONG. SELL order has been closed"); AlertOn = false; } } } //+------------------------------------------------------------------+ //| implementing entry signals | //+------------------------------------------------------------------+ //------------- Placing Buy -------------------- if(cMainBuffer>cSignalBuffer) if(pMainBuffer<pSignalBuffer) if(CountLongs()<1) { OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,Slippage, StopLong(Bid,StopLoss),TakeLong(Ask,TakeProfit),EA_Name,MagicNumber,0,Blue); { if (AlertOn) { Alert( " "+Symbol()+" M"+Period()+": Signal to LONG. BUY order has been placed"); AlertOn = false; } } } //------------- Placing Sell -------------------- if(cMainBuffer<cSignalBuffer) if(pMainBuffer>pSignalBuffer) if(CountShorts()<1) { OrderSend(Symbol(),OP_SELL, LotsOptimized(),Bid,Slippage, StopShrt(Ask,StopLoss),TakeShrt(Bid,TakeProfit),EA_Name,MagicNumber,0,Red); { if (AlertOn) { Alert( " "+Symbol()+" M"+Period()+": Signal to SHORT. SELL order has been placed"); AlertOn = false; } } } //---------------------------- return(0); } //End of Start function //+------------------------------------------------------------------+ //| calculating orders breakeven | //+------------------------------------------------------------------+ void Breakeven() { int totalorders = OrdersTotal(); for(int i=totalorders-1;i>=0;i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber()!=MagicNumber) continue; if(BreakEven== false) continue; if(BreakEvenTrigger == 0) continue; if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol()) if(OrderMagicNumber()==MagicNumber) if(BreakEven== true) if(BreakEvenTrigger > 0) { if(OrderType() == OP_BUY) { if(Ask<OrderOpenPrice()) continue; if(OrderStopLoss()>=OrderOpenPrice()) continue; if((NormalizeDouble(Ask,Digits)-NormalizeDouble(OrderOpenPrice(),Digits))<=(BreakEvenTrigger*Poin)) continue; if(Ask>OrderOpenPrice()) if(OrderStopLoss()<OrderOpenPrice() || OrderStopLoss()==0) if((NormalizeDouble(Ask,Digits)-NormalizeDouble(OrderOpenPrice(),Digits))>(BreakEvenTrigger*Poin)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+3*Poin,OrderTakeProfit(),0,Green); Print( "BUY Order moved to breakeven : ", OrderStopLoss()); } } if(OrderType() == OP_SELL) { if(Bid>OrderOpenPrice()) continue; if(OrderStopLoss()<=OrderOpenPrice()) continue; if((NormalizeDouble(OrderOpenPrice(),Digits)-NormalizeDouble(Bid,Digits))<=(BreakEvenTrigger*Poin)) continue; if(Bid<OrderOpenPrice()) if(OrderStopLoss()>OrderOpenPrice() || OrderStopLoss()==0) if((NormalizeDouble(OrderOpenPrice(),Digits)-NormalizeDouble(Bid,Digits))>(BreakEvenTrigger*Poin)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-3*Poin,OrderTakeProfit(),0,Green); Print( "SELL Order moved to breakeven : ", OrderStopLoss()); } } } } return; } //+------------------------------------------------------------------+ //| modifying orders trailing stop | //+------------------------------------------------------------------+ void Trailingalls(int start,int stop) { if(stop==0) return; int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber()!=MagicNumber) continue; if(TrailingAlls== false) continue; if(start==0) continue; if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol()) if(OrderMagicNumber()==MagicNumber) if(TrailingAlls== true) if(start>0) { if(OrderType()==OP_BUY) { //double Long_profit=NormalizeDouble(NormalizeDouble(Ask,Digits) //-NormalizeDouble(OrderOpenPrice(),Digits)/Poin,0); double Long_profit=NormalizeDouble((Ask-OrderOpenPrice())/Poin,0); //double Long_profit=NormalizeDouble(Ask-OrderOpenPrice(),0)*Poin; double Long_stopcal=NormalizeDouble(Ask,Digits)-(stop*Poin); double Long_stoptrade=OrderStopLoss(); if(Long_profit<=start) continue; if(Long_stopcal<=Long_stoptrade) continue; if(Long_profit>start) if(Long_stoptrade==0||(Long_stoptrade!=0 && Long_stopcal>Long_stoptrade)) { OrderModify(OrderTicket(),OrderOpenPrice(),Long_stopcal,OrderTakeProfit(),0,Blue); Print( "BUY Order trailstop moved : ", OrderStopLoss()); } } if(OrderType()==OP_SELL) { //double Short_profit=NormalizeDouble(NormalizeDouble(OrderOpenPrice(),Digits) //-NormalizeDouble(Bid,Digits)/Poin,0); double Short_profit=NormalizeDouble((OrderOpenPrice()-Bid)/Poin,0); //double Short_profit=NormalizeDouble(OrderOpenPrice()-Bid,0)*Poin; double Short_stopcal=NormalizeDouble(Bid,Digits)+(stop*Poin); double Short_stoptrade=OrderStopLoss(); if(Short_profit<=start) continue; if(Short_stopcal>=Short_stoptrade) continue; if(Short_profit>start) if(Short_stoptrade==0||(Short_stoptrade!=0 && Short_stopcal<Short_stoptrade)) { OrderModify(OrderTicket(),OrderOpenPrice(),Short_stopcal,OrderTakeProfit(),0,Red); Print( "SELL Order trailstop moved : ", OrderStopLoss()); } } } } } //+------------------------------------------------------------------+ //| calculating orders stoploss | //+------------------------------------------------------------------+ double StopLong(double price,int stop) { if(stop==0) return(0); else return(price-(stop*Poin)); } //+--------------------------------- double StopShrt(double price,int stop) { if(stop==0) return(0); else return(price+(stop*Poin)); } //+------------------------------------------------------------------+ //| calculating orders takeprofit | //+------------------------------------------------------------------+ double TakeLong(double price,int take) { if(take==0) return(0); else return(price+(take*Poin)); } //+-------------------------------- double TakeShrt(double price,int take) { if(take==0) return(0); else return(price-(take*Poin)); } //+------------------------------------------------------------------+ //| closing orders | //+------------------------------------------------------------------+ void CloseLongs() { int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()!=Symbol()|| OrderMagicNumber()!=MagicNumber) continue; if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,SkyBlue); } } //--------------------------- void CloseShorts() { int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()!=Symbol()|| OrderMagicNumber()!=MagicNumber) continue; if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Orange); } } //+------------------------------------------------------------------+ //| counting open orders | //+------------------------------------------------------------------+ int CountLongs() { int count=0; int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()!=Symbol()|| OrderMagicNumber()!=MagicNumber) continue; if(OrderType()==OP_BUY) count++; } return(count); } //-------------------------------- int CountShorts() { int count=0; int trade; for(trade=OrdersTotal()-1;trade>=0;trade--) { OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()!=Symbol()|| OrderMagicNumber()!=MagicNumber) continue; if(OrderType()==OP_SELL) count++; } return(count); } //+------------------------------------------------------------------+
آخر تعديل بواسطة ساق الجواء ، 23-04-2009 الساعة 10:45 PM
- 24-04-2009, 02:01 AM #3
رد: كيف يمكن معالجة الرقم العشري الزايد في الأسعار
أولا أبغ أشكرك حبيب الكل على مجهوداتك
و ثانيا برضه أشكرك على الأكواد اللي حأجربها
زي ما إنتم عارفين إنهم أضافوا رقم عشري للأسعار مثل 98.10 إلى 98.100 أو 0.9999 إلى 0.99990
فما هو الكود لإسترجاع الرقم المكون من ثلاث أرقام عشرية إلى رقمين عشريين
~~~ ~~~ ~~~ ~~~ ~~~~ ~~~~ ~~5~~~ ~~~~ ~~~ ~~4 أرقام
وشكرا مقدما
- 24-04-2009, 06:30 AM #4
رد: كيف يمكن معالجة الرقم العشري الزايد في الأسعار
- 24-04-2009, 02:22 PM #5
- 24-04-2009, 07:55 PM #6
رد: كيف يمكن معالجة الرقم العشري الزايد في الأسعار
اسمحوا لي بهذه المشاركة البسيطة.
بالنسبة للتعامل مع TakeProfit او StopLoss او اي متغيير فيه عدد النقاط، فهناك طريقة اخرى.
وهي باستختدام المتغيير المعرف مسبقاً Digits، واللذي يعيد لك قيمة عدد النقاط العشرية للزوج.
مثلاً، باضافة الكود التالي بعد start فوراً، وابقاء باقي الكود كما هو عليه، سيتعامل الاكسبيرت مع اي حالة تلقائياً.
كود:int start() { if (Digits==3 || Digits==5) { TakeProfit=TakeProfit*10; StopLoss=StopLoss*10; TrailingStop=TrailingStop*10; او اي متغييرات فيها عدد نقاط } . . .
- 24-04-2009, 09:15 PM #7
رد: كيف يمكن معالجة الرقم العشري الزايد في الأسعار
شكرا على المشاركة وكما قلت في الأعلى "هناك أيضا عدة طرق أخرى وما أستخدمه منها شخصيا واعتدت عليه وقد لا تكون الطريقة الأفضل هي ما ذكرته في الأعلى" ولكل شيخ طريقته ولم أرد سرد الطرق الأخرى لأني لم أمارسها ولئلا أسبب تشتتا للإخوان.
أما أنت فبما أنك متقن لطريقتك فحسن أنك شاركت حتى يكون الإخوان بالخيار وحتى تجيب على تساؤلاتهم عن طريقتك إن أحبوا اتباعها.
- 25-04-2009, 02:51 AM #8
المواضيع المتشابهه
-
كيف اضع ستوب لوز و تيك بروفت بالنظام العشري ببرنامج الميتاتريدر
By سيمون in forum استفسارات وأسئلة المبتدئينمشاركات: 7آخر مشاركة: 21-07-2010, 06:30 PM -
بوش: معالجة الأزمة المالية مهمة عالمية
By التحليلات والأخبار in forum سوق تداول العملات الأجنبية والسلع والنفط والمعادنمشاركات: 1آخر مشاركة: 12-10-2008, 06:52 AM -
توصية الصاحي
By صاحب سمو المشاعر in forum توقعات وتوصيات سوق العملاتمشاركات: 3آخر مشاركة: 13-03-2008, 09:41 AM -
معالجة افشاء اسرار المنزل عند الاطفال ....
By zid in forum استراحة اعضاء المتداول العربيمشاركات: 1آخر مشاركة: 09-06-2007, 08:42 AM -
التفاؤل الزايد عن حده ... هينقلب لضده ...
By Dr.GM in forum سوق تداول العملات الأجنبية والسلع والنفط والمعادنمشاركات: 2آخر مشاركة: 27-11-2006, 01:40 AM