عرض خصائص الـ Moving AverageS
السلام عليكم ..
هذا هو الكود من برنامج الميتا .. مع اضافة صغيرة محددة باللون الاحمر ..
احاول عرض خصائص المتوسطات الحسابية Moving Averages.. من نوع و قيمة و سعر التطبيق ..
ولكن .. واجهتني عدة امور:
1- نجحت في ابراز خصائص المتوسط .. و لكنها تظهر مع السعر بفارق عدد معين من النقاط ..
فكيف استطيع لصقها مع المتوسط لا مع السعر .
2- يظهر سعر التطبيق كرقم .. فالرقم 0 يمثل سعر الاغلاق .. و الرقم 3 يمثل ادنى قيمة .. و احببت ان ارى كلمة Close او high او Low بدلا من الارقام.
3- عند اضافة متوسط اخر .. تختفى خصائص المتوسط الاول .. بحكم انني استخدم المتغيير نفسه ,... فما هي الطرق الاخرى لعرض خصائص متوسط اخر بدون التاثير على المتوسط الاول.
و دمــــــتـــــم ســـــــــــــــــالـــــــمـــيـــن :icon26:
كود:
//+------------------------------------------------------------------+
//| Custom Moving Average.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int MA_Period=50;
extern int MA_Shift=0;
extern int MA_Method=0;
//---- indicator buffers
double ExtMapBuffer[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int draw_begin;
string short_name;
//---- drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexShift(0,MA_Shift);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
if(MA_Period<2) MA_Period=13;
draw_begin=MA_Period-1;
//---- indicator short name
switch(MA_Method)
{
case 1 : short_name="EMA("; draw_begin=0; break;
case 2 : short_name="SMMA("; break;
case 3 : short_name="LWMA("; break;
default :
MA_Method=0;
short_name="SMA(";
}
IndicatorShortName(short_name+MA_Period+")");
SetIndexDrawBegin(0,draw_begin);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
//---- initialization done
ObjectDelete("MA");
ObjectCreate( "MA" ,OBJ_TEXT, 0, Time[0], Close[0]+ 0.0020);
ObjectSetText( "MA",short_name+ MA_Period+") "+MA_Method ,12, "Arial", Gold);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
if(Bars<=MA_Period) return(0);
ExtCountedBars=IndicatorCounted();
//---- check for possible errors
if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
if (ExtCountedBars>0) ExtCountedBars--;
//----
switch(MA_Method)
{
case 0 : sma(); break;
case 1 : ema(); break;
case 2 : smma(); break;
case 3 : lwma();
}
//---- done
return(0);
}
//+------------------------------------------------------------------+
//| Simple Moving Average |
//+------------------------------------------------------------------+
void sma()
{
double sum=0;
int i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
if(pos<MA_Period) pos=MA_Period;
for(i=1;i<MA_Period;i++,pos--)
sum+=Close[pos];
//---- main calculation loop
while(pos>=0)
{
sum+=Close[pos];
ExtMapBuffer[pos]=sum/MA_Period;
sum-=Close[pos+MA_Period-1];
pos--;
}
//---- zero initial bars
if(ExtCountedBars<1)
for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}
//+------------------------------------------------------------------+
//| Exponential Moving Average |
//+------------------------------------------------------------------+
void ema()
{
double pr=2.0/(MA_Period+1);
int pos=Bars-2;
if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
while(pos>=0)
{
if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
pos--;
}
}
//+------------------------------------------------------------------+
//| Smoothed Moving Average |
//+------------------------------------------------------------------+
void smma()
{
double sum=0;
int i,k,pos=Bars-ExtCountedBars+1;
//---- main calculation loop
pos=Bars-MA_Period;
if(pos>Bars-ExtCountedBars) pos=Bars-ExtCountedBars;
while(pos>=0)
{
if(pos==Bars-MA_Period)
{
//---- initial accumulation
for(i=0,k=pos;i<MA_Period;i++,k++)
{
sum+=Close[k];
//---- zero initial bars
ExtMapBuffer[k]=0;
}
}
else sum=ExtMapBuffer[pos+1]*(MA_Period-1)+Close[pos];
ExtMapBuffer[pos]=sum/MA_Period;
pos--;
}
}
//+------------------------------------------------------------------+
//| Linear Weighted Moving Average |
//+------------------------------------------------------------------+
void lwma()
{
double sum=0.0,lsum=0.0;
double price;
int i,weight=0,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
if(pos<MA_Period) pos=MA_Period;
for(i=1;i<=MA_Period;i++,pos--)
{
price=Close[pos];
sum+=price*i;
lsum+=price;
weight+=i;
}
//---- main calculation loop
pos++;
i=pos+MA_Period;
while(pos>=0)
{
ExtMapBuffer[pos]=sum/weight;
if(pos==0) break;
pos--;
i--;
price=Close[pos];
sum=sum-lsum+price*MA_Period;
lsum-=Close[i];
lsum+=price;
}
//---- zero initial bars
if(ExtCountedBars<1)
for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}
//+------------------------------------------------------------------+
رد: عرض خصائص الـ Moving AverageS
اقتباس:
المشاركة الأصلية كتبت بواسطة t4fast
السلام عليكم ..
هذا هو الكود من برنامج الميتا .. مع اضافة صغيرة محددة باللون الاحمر ..
احاول عرض خصائص المتوسطات الحسابية Moving Averages.. من نوع و قيمة و سعر التطبيق ..
ولكن .. واجهتني عدة امور:
1- نجحت في ابراز خصائص المتوسط .. و لكنها تظهر مع السعر بفارق عدد معين من النقاط ..
فكيف استطيع لصقها مع المتوسط لا مع السعر .
2- يظهر سعر التطبيق كرقم .. فالرقم 0 يمثل سعر الاغلاق .. و الرقم 3 يمثل ادنى قيمة .. و احببت ان ارى كلمة Close او high او Low بدلا من الارقام.
3- عند اضافة متوسط اخر .. تختفى خصائص المتوسط الاول .. بحكم انني استخدم المتغيير نفسه ,... فما هي الطرق الاخرى لعرض خصائص متوسط اخر بدون التاثير على المتوسط الاول.
و دمــــــتـــــم ســـــــــــــــــالـــــــمـــيـــن :icon26:
وعليكم السلام
المشكلة الأولى ليس لها حل مباشر إلا بإضافة نقاط معينة لنقطة التموضع حتى يظهر النص بالشكل المطلوب .
لحل المشكلة الثانية يمكن عمل وظيفة خاصة لإظهار النص بدل الرقم وهي تكون مشابهة لما يلي :
كود PHP:
string GetMethodText(int per)
{
switch(per) { case 0: return("Close"); break; case 1: return("High"); break; case 2: return("Low"); break; }}
بعد ذلك يمكنك استدعاء هذه الوظيفة كالتالي :
كود PHP:
ObjectSetText( "MA",short_name+ MA_Period+") "+GetMethodText(MA_Method) ,12, "Arial", Gold);
لحل المشكلة الأخيرة يجب تسمية الكائن النصي باسم نصي مضافا إليه الفترة وبهذه الحالة يتم إنشاء مربع نصي خاص بكل متوسط .
كود PHP:
ObjectCreate( "MA"+MA_Period ,OBJ_TEXT, 0, Time[0], Close[0]+ 0.0020);
رد: عرض خصائص الـ Moving AverageS
مشكور عزيزي على هذه الحلول ..
بالنسبة للكود نفسه.. اي الذي ادرجته ..
لا يوجد به خيار "تطبيق السعر" ..
صحيح ان فكرة GetMethodText تعمل بالشكل المراد لها .. ولكن سعر التطبيق غائب من اساسه :doh: ... ولا املك الكود لل moving average كاملا ( القيمة و نوع و التطبيق على )
و ان شاء الله ساواصل في هذا الموضوع متى توفر الكود كاملا. :hands:
شكرا لك .
1 مرفق
رد: عرض خصائص الـ Moving AverageS
ساقوم بادراج هذا الكود ... و على الله التوفيق ..
كود:
//| |
//+------------------------------------------------------------------+
double GetAppliedPrice(int nAppliedPrice, int nIndex)
{
double dPrice;
//----
switch(nAppliedPrice)
{
case 0: dPrice=Close[nIndex]; break;
case 1: dPrice=Open[nIndex]; break;
case 2: dPrice=High[nIndex]; break;
case 3: dPrice=Low[nIndex]; break;
case 4: dPrice=(High[nIndex]+Low[nIndex])/2.0; break;
case 5: dPrice=(High[nIndex]+Low[nIndex]+Close[nIndex])/3.0; break;
case 6: dPrice=(High[nIndex]+Low[nIndex]+2*Close[nIndex])/4.0; break;
default: dPrice=0.0;
}
//----
return(dPrice);
}
في الصورة ..
يظهر الرقم (سعر ال moving average ) ب 8 ارقام بعد الفاصلة ..
كيف اقوم بتصغيرها الى 4 .. :asvc:
رد: عرض خصائص الـ Moving AverageS
اقتباس:
المشاركة الأصلية كتبت بواسطة t4fast
في الصورة ..
يظهر الرقم (سعر ال moving average ) ب 8 ارقام بعد الفاصلة ..
كيف اقوم بتصغيرها الى 4 .. :asvc:
استخدم الوظيفة التالية :
كود PHP:
string DoubleToStr(double value, int digits)
مثال:
كود PHP:
Print(DoubleToStr(a,4));
حيث الرقم 4 تعني عدد الخانات بعد الفاصلة .
يمكنك استخدام المتحول الجاهز Digits بدل الرقم الصحيح 4
وبذلك تضمن أن يظهر الرقم بالخانات الصحيحة حسب الزوج المستخدم .
لأنه أحيانا يكون 4 وأحيانا 2 حسب الزوج المستخدم .
ويصبح المثال كالتالي :
كود PHP:
Print(DoubleToStr(a,Digits));
رد: عرض خصائص الـ Moving AverageS
كود:
//+------------------------------------------------------------------+
//| Custom Moving Average.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int MA_Period=50;
//extern int MA_Shift=0;
extern int MA_Method=0;
extern int AppliedPrice=0;
//---- indicator buffers
double ExtMapBuffer[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int draw_begin;
string short_name;
//---- drawing settings
SetIndexStyle(0,DRAW_LINE);
//SetIndexShift(0,MA_Shift);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
if(MA_Period<2) MA_Period=13;
draw_begin=MA_Period-1;
//---- indicator short name
switch(MA_Method)
{
case 1 : short_name="EMA("; draw_begin=0; break;
case 2 : short_name="SMMA("; break;
case 3 : short_name="LWMA("; break;
default :
MA_Method=0;
short_name="SMA(";
}
IndicatorShortName(short_name+MA_Period+")");
SetIndexDrawBegin(0,draw_begin);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
//---- initialization done
//GetAppliedPrice(AppliedPrice);
double ma_1;
ma_1=iMA(0,0,MA_Period,0,MA_Method,AppliedPrice,0); // used to print the ma value
ObjectDelete("MA"+MA_Period);
ObjectCreate("MA"+MA_Period ,OBJ_TEXT, 0, Time[0], ma_1+ 0.0020);
ObjectSetText("MA"+MA_Period,short_name+ MA_Period+") "+GetMethodText(AppliedPrice)+" "+ (DoubleToStr(ma_1,Digits)) ,12, "Arial", indicator_color1);
return(0);
}
//+------------------------------------------------------------------+
string GetMethodText(int AppliedPrice)
{
switch(AppliedPrice) {case 0: return("C");break; case 2:return("H");break; case 3:return("L");break;}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
double GetAppliedPrice(int nAppliedPrice,int nIndex)
{
switch(nAppliedPrice)
{
case 0: return(Close[nIndex]); break;
case 2: return(High[nIndex]); break;
case 3: return(Low[nIndex]); break;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
if(Bars<=MA_Period) return(0);
ExtCountedBars=IndicatorCounted();
//---- check for possible errors
if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
if (ExtCountedBars>0) ExtCountedBars--;
//----
switch(MA_Method)
{
case 0 : sma(); break;
case 1 : ema(); break;
case 2 : smma(); break;
case 3 : lwma();
}
//---- done
return(0);
}
//+------------------------------------------------------------------+
//| Simple Moving Average |
//+------------------------------------------------------------------+
void sma()
{
double sum=0;
int i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
if(pos<MA_Period) pos=MA_Period;
for(i=1;i<MA_Period;i++,pos--)
sum+= GetAppliedPrice(AppliedPrice) //sum+ = Close[pos];
//---- main calculation loop
while(pos>=0)
{
sum+=Close[pos];
ExtMapBuffer[pos]=sum/MA_Period;
sum-=Close[pos+MA_Period-1];
pos--;
}
//---- zero initial bars
if(ExtCountedBars<1)
for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}
//+------------------------------------------------------------------+
//| Exponential Moving Average |
//+------------------------------------------------------------------+
void ema()
{
double pr=2.0/(MA_Period+1);
int pos=Bars-2;
if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
while(pos>=0)
{
if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
pos--;
}
}
//+------------------------------------------------------------------+
//| Smoothed Moving Average |
//+------------------------------------------------------------------+
void smma()
{
double sum=0;
int i,k,pos=Bars-ExtCountedBars+1;
//---- main calculation loop
pos=Bars-MA_Period;
if(pos>Bars-ExtCountedBars) pos=Bars-ExtCountedBars;
while(pos>=0)
{
if(pos==Bars-MA_Period)
{
//---- initial accumulation
for(i=0,k=pos;i<MA_Period;i++,k++)
{
sum+=Close[k];
//---- zero initial bars
ExtMapBuffer[k]=0;
}
}
else sum=ExtMapBuffer[pos+1]*(MA_Period-1)+Close[pos];
ExtMapBuffer[pos]=sum/MA_Period;
pos--;
}
}
//+------------------------------------------------------------------+
//| Linear Weighted Moving Average |
//+------------------------------------------------------------------+
void lwma()
{
double sum=0.0,lsum=0.0;
double price;
int i,weight=0,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
if(pos<MA_Period) pos=MA_Period;
for(i=1;i<=MA_Period;i++,pos--)
{
price=Close[pos];
sum+=price*i;
lsum+=price;
weight+=i;
}
//---- main calculation loop
pos++;
i=pos+MA_Period;
while(pos>=0)
{
ExtMapBuffer[pos]=sum/weight;
if(pos==0) break;
pos--;
i--;
price=Close[pos];
sum=sum-lsum+price*MA_Period;
lsum-=Close[i];
lsum+=price;
}
//---- zero initial bars
if(ExtCountedBars<1)
for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}
//+------------------------------------------------------------------+
ان خصائص العرض الى الان مقبولة .. بفضل الله و من ثم بفضل وضاح
المعضلة الاخيرة الان .. ادراج سعر التطبيق في المعادلة ..
بعد عدة محاولات وصلت الى هذا الكود .. وبه بعض الاخطاء التي تمنع استخدامه .. :no3::0006:
اعتقد ان الفكرة هي تغيير الـ Close [Pos] الى شي اخر بحسب الطلب . :016:
راجي منكم التصحيح .. :icon26:
1 مرفق
رد: عرض خصائص الـ Moving AverageS
بالنسبة للالوان ..
عند اضافة متوسط اخر بلون مختلف (غير الاحمر ) تظهر الكتابة بالاحمر .. وكانه لا يقرا اللون الجديد على المؤشر ..
فما هي طريقة تحديث اللون ..
رد: عرض خصائص الـ Moving AverageS
من الاخطاء القوية .. ان الكود لا يقع تحت int start() ..
:) نقلته الى اسفل من int start() .. و ظهرت مشكلة عدم التعرف على shortname
رد: عرض خصائص الـ Moving AverageS
و الحمد لله ..
قمت بتعريف ال shortname من جديد اسفل من int start() ..
و المؤشر يعمل الان بالشكل المطلوب ..
:) اما موضوع الالوان .. فمازال البحث جاري ..
رد: عرض خصائص الـ Moving AverageS
والحمد لله .. تم حل موضوع الالوان :) .. بتعريف اللون كمتغيير وليس كخاصية .
2 مرفق
رد: عرض خصائص الـ Moving AverageS
الى الان .. وصلت الى هذه النقطة.:asvc:
2 مرفق
رد: عرض خصائص الـ Moving AverageS
الان تم اظهار كل البيانات المتعلقة بالمتوسط .. مع تفعيل جميع الخصائص ..
رد: عرض خصائص الـ Moving AverageS
ماشاء الله تبارك الله أتمنى لك المزيد من التوفيق
ولكن لوتكرمت أخي الكريم أن تقوم باضافة اظهار السعر على مستويات المتوسط لا المتوسط فقط
وتقبل شكري وامتناني
https://forum.arabictrader.com/912409-1-post.html
رد: عرض خصائص الـ Moving AverageS