Ayuda a la codificación - página 321

 

Esto es lo que hice al tratar de aplicar un MA a la SSA directamente, como el ejemplo en mi foto.

Por supuesto, soy un completo novato en la codificación ...

Así que, si alguien pudiera decirme qué tengo que cambiar, se lo agradecería mucho.

Me gusta resolver las cosas, aunque sea un noob en esta materia, pero si uno no intenta resolver sus problemas, seguirá siendo un noob para siempre ...

//+------------------------------------------------------------------+

//| FullSSA.mq4 |||

//| Copyright © 2007,klot ||

/ /| klot@mail.ru

//+------------------------------------------------------------------+

#property copyright "Copyright © 2007, klot"

#property link "klot@mail.ru"

#import "libSSA.dll"

void fastSingular(double& a[],int n,int lag ,int s,double&b[]);

#importar

#property indicador_separar_ventana

#property indicador_buffers 2

#property indicador_color1 Blanco

#property indicator_color2 DeepPink

#property indicator_width1 3

#propiedad indicator_level1 0.0

#propiedad indicator_levelstyle STYLE_DASH

#property indicador_nivelcolor Magenta

extern string note_TimeFrames ="M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";

extern string TimeFrame = "Marco temporal actual";

extern int Lag = 10;

extern int NumComps = 2;

extern int PeriodNorm = 10;

extern int N = 1000;

extern int SSAMa_Mode = 3;

extern int MaPeriod = 5

extern int Ma_Mode = 3;

extern bool Interpolate = true

double SSA[];

double ssaWork[];

double SSAma[];

double arryTimeSeries[];

string indicatorFileName;

bool returnBars;

bool calculateValue;

int timeFrame;

int init()

{

SetIndexBuffer(0,SSA); SetIndexBuffer(1,SSAma);SetIndexStyle(0,DRAW_LINE); SetIndexDrawBegin(0,Bars-N);

indicatorFileName = WindowExpertName();

calculateValue = (TimeFrame=="calculateValue"); if(calculateValue) return(0);

returnBars = (TimeFrame=="returnBars"); if(returnBars) return(0);

timeFrame = stringToTimeFrame(TimeFrame);

IndicatorShortName(timeFrameToString(timeFrame)+ " FullSSA normalize correct");

return(0);

}

int deinit(){return(0);}

int inicio()

{

double dev,ma

int nmax, nmin;

int tamaño = N;

if (size>Bars) size = Bars;

if (ArraySize(arryTimeSeries) != size)

{

ArrayResize(arryTimeSeries,size);

ArrayResize(ssaWork,size);

}

int límite, i;

int barras_contadas=IndicadorContado();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=MathMin(Bares-contados_barras,Bares-1);

if (returnBars) { SSA[0] = limit+1; return(0); }

if (calculateValue || timeFrame==Period())

{

for( i=size-1; i>=0; i--)

{

ma=iMA(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

dev=3*iStdDev(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

if(dev==0) dev=0.1;

arryTimeSeries=(Close-ma)/dev;//iDeMarker(NULL,0,PeriodNorm,i);

ObjectDelete("Venta "+Tiempo);

ObjectDelete("Comprar "+Hora);

}

fastSingular(arryTimeSeries,size,Lag,NumComps,ssaWork);

ArrayCopy(SSA,ssaWork);

nmax=ArrayMáximo(SSA,3,1);

nmin=ArrayMínimo(SSA,3,1);

if(nmax==2) {

ObjectCreate("Venta "+Hora[0],OBJ_ARROW,0,Hora[0],Apertura[0]);

ObjectSet("Vender "+Tiempo[0],OBJPROP_ARROWCODE,226);

}

if(nmin==2) {

ObjectCreate("Compra "+Hora[0],OBJ_ARROW,0,Hora[0],Apertura[0]);

ObjectSet("Buy "+Time[0],OBJPROP_ARROWCODE,225);

}

//----

return(0);

}

limit =MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"", "returnBars",0,0)*timeFrame/Period()));

for(i=limit; i>=0; i--)

for (i=limit; i>=0; i--) SSAma = iMAOnArray(SSA,Bars,MaPeriod,0,Ma_Mode,i);

{

int y = iBarShift(NULL,timeFrame,Time);

SSA =iCustom(NULL,timeFrame,indicatorFileName,"", "calculateValue",Lag,NumComps,PeriodNorm,N,0,y);

if (timeFrame <= Period() ||y==iBarShift(NULL,timeFrame,Time)) continue;

if (!Interpolate) continue;

datetime time = iTime(NULL,timeFrame,y);

for(int n = 1; i+n =time; n++) continue;

double factor = 1.0 / n;

for(int x = 1; x < n; x++)

{

SSA= x*factor*SSA + (1,0-x*factor)*SSA;

}

}

return(0);

}

//+------------------------------------------------------------------+

string sTfTable[] ={"M1","M5","M15","M30","H1","H4","D1","W1","MN"};

int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

//

//

//

//

//

int stringToTimeFrame(string tfs)

{

tfs = StringUpperCase(tfs);

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tfs==sTfTable || tfs==""+iTfTable)return(MathMax(iTfTable,Period());

return(Periodo());

}

string timeFrameToString(int tf)

{

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tf==iTfTable) return(sTfTable);

return("");

}

//

//

//

//

//

stringUpperCase(string str)

{

string s = str;

for (int length=StringLen(str)-1; length>=0; length--)

{

int tchar = StringGetChar(s, longitud);

if((tchar > 96 && tchar 223 && tchar < 256))

s = StringSetChar(s, length, tchar - 32);

else if(tchar > -33 && tchar < 0)

s = StringSetChar(s, length, tchar + 224);

}

return(s);

}

 
mladen:
Para el cambio de pendiente prueba algo así :[PHP]double current = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0);double previous1 = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1);double previous2 = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,2);if (current>previous1 && previous1

Gracias Mladen!!!, ahora me imagino que se me olvidó añadir Extmapbuffer, el número 2 a las condiciones.

¿Cómo sería la condición para "while is Uptrend" comprar o "while is Dntrend" luego vender, pues ya tengo condiciones de ejecución para las órdenes, no para los cambios de pendiente?

Gracias de nuevo

Daniel

 

Estimado Mladen,

Necesito que la condición sea "mientras haya tendencia" no en el cambio exacto de la pendiente, así que escribí esto pero tengo problemas con la tendencia a la baja, ¿son estas condiciones correctas? Para la tendencia alcista parece funcionar bien... lo mismo para la tendencia bajista tengo problemas... Espero que me puedas ayudar, gracias.

if (current>previous1)

{

// tendencia alcista

}

if (current<previous1)

{

// tendencia a la baja ESTO NO FUNCIONA NO SE ACTIVA NINGUNA ORDEN DE VENTA EN ABSOLUTO...

}

 
Wulong10:
Esto es lo que hice al intentar aplicar un MA a la SSA directamente, como el ejemplo de mi imagen.

Por supuesto, soy un completo novato en la codificación ...

Así que, si alguien pudiera decirme qué tengo que cambiar, se lo agradecería mucho.

Me gusta resolver las cosas, aunque sea un noob en esta materia, pero si uno no intenta resolver sus problemas, seguirá siendo un noob para siempre ...

//+------------------------------------------------------------------+

//| FullSSA.mq4 |||

//| Copyright © 2007,klot ||

/ /| klot@mail.ru

//+------------------------------------------------------------------+

#property copyright "Copyright © 2007, klot"

#property link "klot@mail.ru"

#import "libSSA.dll"

void fastSingular(double& a[],int n,int lag ,int s,double&b[]);

#importar

#property indicador_separar_ventana

#property indicador_buffers 2

#property indicador_color1 Blanco

#property indicator_color2 DeepPink

#property indicator_width1 3

#propiedad indicator_level1 0.0

#propiedad indicator_levelstyle STYLE_DASH

#property indicador_nivelcolor Magenta

extern string note_TimeFrames ="M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";

extern string TimeFrame = "Marco temporal actual";

extern int Lag = 10;

extern int NumComps = 2;

extern int PeriodNorm = 10;

extern int N = 1000;

extern int SSAMa_Mode = 3;

extern int MaPeriod = 5

extern int Ma_Mode = 3;

extern bool Interpolate = true

double SSA[];

double ssaWork[];

double SSAma[];

double arryTimeSeries[];

string indicatorFileName;

bool returnBars;

bool calculateValue;

int timeFrame;

int init()

{

SetIndexBuffer(0,SSA); SetIndexBuffer(1,SSAma);SetIndexStyle(0,DRAW_LINE); SetIndexDrawBegin(0,Bars-N);

indicatorFileName = WindowExpertName();

calculateValue = (TimeFrame=="calculateValue"); if(calculateValue) return(0);

returnBars = (TimeFrame=="returnBars"); if(returnBars) return(0);

timeFrame = stringToTimeFrame(TimeFrame);

IndicatorShortName(timeFrameToString(timeFrame)+ " FullSSA normalize correct");

return(0);

}

int deinit(){return(0);}

int inicio()

{

double dev,ma

int nmax, nmin;

int tamaño = N;

if (size>Bars) size = Bars;

if (ArraySize(arryTimeSeries) != size)

{

ArrayResize(arryTimeSeries,size);

ArrayResize(ssaWork,size);

}

int límite, i;

int barras_contadas=IndicadorContado();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=MathMin(Bares-contados_barras,Bares-1);

if (returnBars) { SSA[0] = limit+1; return(0); }

if (calculateValue || timeFrame==Period())

{

for( i=size-1; i>=0; i--)

{

ma=iMA(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

dev=3*iStdDev(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

if(dev==0) dev=0.1;

arryTimeSeries=(Close-ma)/dev;//iDeMarker(NULL,0,PeriodNorm,i);

ObjectDelete("Venta "+Tiempo);

ObjectDelete("Comprar "+Hora);

}

fastSingular(arryTimeSeries,size,Lag,NumComps,ssaWork);

ArrayCopy(SSA,ssaWork);

nmax=ArrayMáximo(SSA,3,1);

nmin=ArrayMínimo(SSA,3,1);

if(nmax==2) {

ObjectCreate("Venta "+Hora[0],OBJ_ARROW,0,Hora[0],Apertura[0]);

ObjectSet("Vender "+Tiempo[0],OBJPROP_ARROWCODE,226);

}

if(nmin==2) {

ObjectCreate("Comprar "+Hora[0],OBJ_ARROW,0,Hora[0],Apertura[0]);

ObjectSet("Buy "+Time[0],OBJPROP_ARROWCODE,225);

}

//----

return(0);

}

limit =MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"", "returnBars",0,0)*timeFrame/Period()));

for(i=limit; i>=0; i--)

for (i=limit; i>=0; i--) SSAma = iMAOnArray(SSA,Bars,MaPeriod,0,Ma_Mode,i);

{

int y = iBarShift(NULL,timeFrame,Time);

SSA =iCustom(NULL,timeFrame,indicatorFileName,"", "calculateValue",Lag,NumComps,PeriodNorm,N,0,y);

if (timeFrame <= Period() ||y==iBarShift(NULL,timeFrame,Time)) continue;

if (!Interpolate) continue;

datetime time = iTime(NULL,timeFrame,y);

for(int n = 1; i+n =time; n++) continue;

double factor = 1.0 / n;

for(int x = 1; x < n; x++)

{

SSA= x*factor*SSA + (1,0-x*factor)*SSA;

}

}

return(0);

}

//+------------------------------------------------------------------+

string sTfTable[] ={"M1","M5","M15","M30","H1","H4","D1","W1","MN"};

int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

//

//

//

//

//

int stringToTimeFrame(string tfs)

{

tfs = StringUpperCase(tfs);

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tfs==sTfTable || tfs==""+iTfTable)return(MathMax(iTfTable,Period());

return(Periodo());

}

string timeFrameToString(int tf)

{

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tf==iTfTable) return(sTfTable);

return("");

}

//

//

//

//

//

stringUpperCase(string str)

{

string s = str;

for (int length=StringLen(str)-1; length>=0; length--)

{

int tchar = StringGetChar(s, longitud);

if((tchar > 96 && tchar 223 && tchar < 256))

s = StringSetChar(s, length, tchar - 32);

else if(tchar > -33 && tchar < 0)

s = StringSetChar(s, length, tchar + 224);

}

return(s);

}

Wulong10

No veo la imagen

¿Podrías adjuntarla por favor?

 

Ya había publicado la imagen, pero aquí está de nuevo.

Entonces, cuando tomo una MA de MT4 y la aplico a la SSA (aplicar a los primeros datos ind.), la MA se ve bien, cuando abro MT4, pero cuando se ejecuta en tiempo real, ya no sigue la SSA.

Esto sólo ocurre en la M1, en la M5 se ejecuta sin problema.

La imagen debería explicarlo visualmente.

Gracias.

Archivos adjuntos:
ssa.png  72 kb
 
Wulong10:
Ya había publicado la imagen, pero aquí está de nuevo.

Entonces, cuando tomo una MA de MT4 y la aplico a la SSA (aplicar a los primeros datos ind.), la MA se ve bien, cuando abro MT4, pero cuando se ejecuta en tiempo real, ya no sigue la SSA.

Esto sólo ocurre en la M1, en la M5 se ejecuta sin problema.

La imagen debería explicarlo visualmente.

Gracias.

No olvides que el SSA se recalcula. Si no calculas la MA de todas las barras del SSA que se recalculan entonces dejará de seguir el SSA

 

Ok, ahora entiendo, por qué funciona en el M5, es porque he puesto el período de la MA allí a 1 y en el M1 lo he puesto a 2 ....Eso debería resolver el problema. Lo he probado en mi simulador de trading, no es perfecto, pero sí mucho mejor.

Con el periodo 1 la MA debería seguir el SSA.

Pero, ¿cómo puedo incorporar un MA directamente en el código de la SSA? Y también debería recalcular todas las barras del SSA....o ¿ no es posible ?

 
Wulong10:
Ok, ahora entiendo, por qué funciona en el M5, es porque he puesto el período de la MA allí a 1 y en el M1 lo he puesto a 2 ....Eso debería resolver el problema. ¡Lo he probado en mi simulador de trading, no es perfecto, pero mucho mejor !

Con el periodo 1 la AM debería seguir la SSA.

Pero, ¿cómo puedo incorporar una MA directamente en el código de la SSA? Y también debe recalcular todas las barras de SSA....o no es posible?

Wulong10

¿Puedes publicar tu archivo mq4 también (copiar texto a mql casi siempre causa algunos problemas)?

 

No importa la última petición

Aquí hay una versión con una media móvil añadida: ssa__ma.mq4

Archivos adjuntos:
ssa__ma.mq4  5 kb
ssa__ma.gif  75 kb
 

¡Ok, gracias Mladen, eres el mejor!

No tengo tiempo para probarlo ahora, es el pie esta tarde, te haré saber el resultado ...cuando el tiempo lo permita.

Ahora también puedo ver cómo debería haberlo hecho, así que seré un 0,5% menos tonto después de haberlo estudiado.

Razón de la queja: