Filtrar operaciones dentro del loop por símbolo - página 3

 
Jajajaajajaj, muy buena @Imanol Salazar Garcia.
Saludos!!!
 

Nuevo problema, no toma el valor POSITION_VOLUME correctamente:

               double SL=PositionGetDouble(POSITION_SL);
               double TP=PositionGetDouble(POSITION_TP);
               double PV=PositionGetDouble(POSITION_VOLUME);
               double PP=PositionGetDouble(POSITION_PROFIT);
               double Equity=AccountInfoDouble(ACCOUNT_EQUITY);
               double OP=PositionGetDouble(POSITION_PRICE_OPEN);
               double Balance=AccountInfoDouble(ACCOUNT_BALANCE);
               double CP=PositionGetDouble(POSITION_PRICE_CURRENT);
               int SD=(int)SymbolInfoInteger(PSymbol,SYMBOL_DIGITS);
               double TV=PV++;BEF+=OP*PV;BE=NormalizeDouble(BEF/TV,SD);
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){
                  Alert(PSymbol," OP=",OP," PV=",PV);
                  Alert(PSymbol," BEF= ",BEF,", TV= ",TV);
                  Alert(PSymbol," long deal breakeven price is ",BE);

Sin embargo la suma del volumen total (VT) sí es correcta, dejo una captura de pantalla:

:

Es dentro del módulo POSITION_TYPE donde está fallando, por lo que he podido comprobar pero desconozco el motivo.

 

A cada paso que avanzamos, retrocedemos otro eh? jajaja

Aqui le estas diciendo que TV sea igual que PV, Y LUEGO le sumes 1 a PV:

double PV=0.01;
double TV=PV++;

//RESULT
//PV=1.01
//TV=0.01

Esa es la orden que das, y eso es lo que hace el programa, ¿porque le das esa orden? yo no lo se.

Yo lo que creo es que querias sumar PV a TV, para ello recuerda que TV debe iniciarse la primera vez a 0 y a partir de ahi ir sumandole PV's.

double PV=0.01;
double TV=0;

//Y luego dentro de algun loop o lo que sea
for(int i=0;i<5;i++) TV+=PV;

//RESULT
//PV=0.01
//TV=0.05
 
Imanol Salazar Garcia:

A cada paso que avanzamos, retrocedemos otro eh? jajaja

Aqui le estas diciendo que TV sea igual que PV, Y LUEGO le sumes 1 a PV:

Esa es la orden que das, y eso es lo que hace el programa, ¿porque le das esa orden? yo no lo se.

Yo lo que creo es que querias sumar PV a TV, para ello recuerda que TV debe iniciarse la primera vez a 0 y a partir de ahi ir sumandole PV's.

Sí, gracias. Al final he conseguido corregirlo por mi cuenta y estoy esperando a ver si aplica debidamente el resultado. Éste es el código:

        TV+=PV;BEF+=OP*PV;BE=NormalizeDouble(BEF/TV,SD); // BE
        if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){
                  Print(PSymbol," PV ",PV," OP ",OP," TV ",TV," BEF ",BEF," BE ",BE);
                  //+----------------------------- Breakeven Long ---!
                  if(SL!=BE&&((UseBreakeven==1||(UseBreakeven==2&&TP==0))
                  &&CP>BE+(PartialClose1*10)*Point()) // Breakeven points
                  ||(UseBreakeven==2&&CP>BE+(TP-BE)*(PartialClose1/100))){
                        if(!trade.PositionModify(Ticket,BE,TP)){
                                Alert(PSymbol," PositionModify error ",trade.ResultRetcode());
                                return;
                                }
                        else{Alert(PSymbol," StopLoss set at Breakeven point.");}
                        }

Ahora para que funcione bien debería aplicar el StopLoss en el punto de Breakeven a todas las operaciones, veamos qué pasa.

 
Imanol Salazar Garcia:

A cada paso que avanzamos, retrocedemos otro eh? jajaja

Aqui le estas diciendo que TV sea igual que PV, Y LUEGO le sumes 1 a PV:

Esa es la orden que das, y eso es lo que hace el programa, ¿porque le das esa orden? yo no lo se.

Yo lo que creo es que querias sumar PV a TV, para ello recuerda que TV debe iniciarse la primera vez a 0 y a partir de ahi ir sumandole PV's.

David Diez:

Sí, gracias. Al final he conseguido corregirlo por mi cuenta y estoy esperando a ver si aplica debidamente el resultado. Éste es el código:

Ahora para que funcione bien debería aplicar el StopLoss en el punto de Breakeven a todas las operaciones, veamos qué pasa.

Bueno, según he podido comprobar el breakeven sólo se aplica a una de las órdenes, la última abierta.

Creo que la solución se halla en cerrar el loop donde se realizan los cálculos y abrir uno nuevo para las operaciones. Voy a ver...

P.D.: No lo he conseguido aún, el problema reside en que a cada posición se le asigna el valor correspondiente a cada iteración y no establece un valor conjunto para todas las posiciones.
 
Imanol Salazar Garcia:

Si lo que quieres es navegar por todos los simbolos disponibles usa esto:

No he acabado de entender cual es tu objetivo por la descripción de tu mensaje, pero espero haber acertado ... :P

Suerte

Hola de nuevo, mira tengo este problema. En MT4, al hacer los test para cada símbolo de manera individual ocurre que pasa por todos los símbolos y ralentiza mucho la optimización:


¿Se podría incluir algo así como esto para que la optimización sea más rápida?

string SName;
void OnTester(){
  SName=_Symbol;
  }

Aunque habría que obviar el loop que hay dentro del código:

void OnTick(){
   for(int s=0;s<SymbolsTotal(true);s++){ // <-- Esto ralentiza demasiado la optimización.
      string SName=SymbolName(s,true);
Razón de la queja: