Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 1067

 

¡Ayuda, por favor! Hay 2 archivos: un indicador y un Asesor Experto. ¿Cómo referirse correctamente a la función en el indicador a través de #include? iCustom no es adecuado por varias razones. Esto es lo que he escrito en el indicador:

bool BuyTrue(double& переменная, int переменная) export
{
   //тело функции

   return(true);
}   

Y esto es lo que escribí en el Asesor Experto:

#import "НазваниеИндикатора.ex4"
   bool BuyTrue(double& переменная, int переменная);
if (BuyTrue(переменная, переменная))
Opn_B = true;

Pero por alguna razón, el Asesor Experto no funciona, el indicador no aparece en el gráfico de precios durante las pruebas. ¿Lo he escrito correctamente, y si hay un error, dónde está?

 
AlexeyVik:

Tuta.


No tengo ninguno. Pero sin duda hay un archivo en alguna parte, de donde saco la información grabada.


 

Por favor, ayúdame a compilar a mt4

FileClose' - expresión de tipo 'void' es ilegal TickToCVS~.mq4 84 12

Archivos adjuntos:
 
abeiks:

No tengo ninguno. Pero sin duda hay un archivo en alguna parte y obtengo la información grabada de él.


Mi captura de pantalla muestra que el menú es de MetaEditor y tu captura de pantalla es de MT.
 
AlexeyVik:

Este es el valor EMPTY_VALUE

Busque dónde está apareciendo.

Gracias. Me has ayudado a resolver el problema. Mi indicador, cuando se carga, calcula las barras a partir de la primera, no desde el cero (lo hice a propósito), en el cero calcula sobre el historial de ticks, no sobre los datos históricos. Ahora cuando cambio de timeframe, lo adjunto al gráfico y reinicio el terminal, pongo a cero los valores del buffer en la barra 0, problema resuelto.
 
AlexeyVik:
Mi captura de pantalla muestra que el menú es de MetaEditor y tu captura de pantalla es de MT.
¡Correcto! Gracias.
 
¿Cómo puedo obtener el precio de apertura de una orden en el historial y no el precio de una posición abierta si esta orden ha sido activada? En la función adjunta, si una orden se ha disparado, esta orden sólo se puede encontrar en las posiciones, por lo que no funciona. Y en las posiciones sólo tenemos el precio de la posición abierta pero no el precio de la orden.
double GetPriceLastCloseOrder(string sy="", int mn=-1) {
  datetime t=0;
  int      i, k=OrdersHistoryTotal(); 
  double r=0;

  if (sy==NULL) sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()>1 && OrderType()<6) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderOpenPrice();
          }
        }
      }
    }
  }
  return(r);
}  
 

Hola chicos, mi pregunta es que no puedo modificar una orden, hay dos aspectos, no entiendo la matemática de la modificación, por favor explicadme.

Tal y como yo lo veo, SL= IF ORDERSELEKT,Bid-ORDERSTOPLOS*POINT,DIGITS

el segundo aspecto.aprendido del video XBMS

como no intenté cambiar los valores de las variables en el tester eror 130 no correcto stop loss y esas chorradas

2016.06.28 21:42:23.402 2016.06.23 00:00 trade RSI inputs: Lots=0.1; Slippage=5; StopLoss=10; TakeProfit=30; RSIPeriod=7; Magic=1087;

aunque hay una multiplicación a partir de los dígitos y la función en el caso de SL errónea


extern double Lots = 0.1;

extern int Deslizamiento = 10;

extern int StopLoss = 10;

external int TakeProfit =30;

extern int RSIPeriod = 7;

extern int Magia =1087;

doble MaRSI;


int TP,SL;

bool tfu;


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

//| Función de inicialización de expertos |

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

int OnInit()

{

if(Dígitos == 3||Dígitos == 5)

{

Deslizamiento *= 10;

TakeProfit *= 10;

StopLoss *= 10;

}

return(INIT_SUCCEED);

}

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

//| Función de desinicialización experta |

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

void OnDeinit(const int reason)

{


}

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

//| función de tic experto |

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

void OnTick()

{

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

//venda abierta

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

MaRSI=iRSI(Symbol(),0, RSIPeriod,PRICE_CLOSE,1);

if(CountTrades() <= 0&MaRSI<=30 )

{

if( SendOrder(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0, "test",Magic,0,Green))

{ int ticket = OrderTicket();

SL = NormalizeDouble( Ask - StopLoss*Point,Digits);

TP = NormalizeDouble( Ask + TakeProfit*Point,Digits);

ModifyOrder(ticket,OrderOpenPrice(),SL,TP,0,Black);

}

}// si(CountTrades <= 0&MaRSI>=70 )

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

//compra abierta

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


}//ONTICK


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

//+contador de pedidos

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


int CuentaOfertas ()

{

int cuenta = 0;

for(int i = OrdersTotal()-1;i>=0;i--)

{

if( OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)//si el pedido es nuestro

count++;//incrementar el contador

}//selección ordenada por índice

}// orden.i===primer orden.

return(count);//Devuelve el número de pedidos

}// función

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

/función de colocación de pedidos con tratamiento de errores

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

int SendOrder( string symbol,int cmd,double volume,double price,int slippage,double stoploss,

double takeprofit,string comment,int magic=0,datetime expiration=0,color arrow_color=CLR_NONE)

{

int err = GetLastError();

err =0;

bool exit_cikl = false;

int ticket = -1;

int Retry = 10; //número de intentos para establecer una orden

int cnt = 0; //cuenta de intentos

if(cmd = OP_BUY || cmd = OP_SELL)

{

while(!exit_cikl)

{

ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err= GetLastError();

switch(err)

{

caso ERR_NO_ERROR:

exit_cikl = true;

romper;

{ caso ERR_SERVER_BUSY:

caso ERR_NO_CONNECTION:

caso ERR_INVALID_PRICE:

caso ERR_OFF_QUOTES:

caso ERR_BROKER_BUSY:

caso ERR_TRADE_CONTEXT_BUSY:

cnt++;

romper;

caso ERR_PRICE_CHANGED:

caso ERR_REQUOTE:

RefreshRates();

continuar;

por defecto:

exit_cikl = true;

romper;

}// switch(err)

if(cnt > Retry)

exit_cikl = true;

if(!exit_cikl)

{

Sleep(1000);

RefreshRates();

}//si no salimos del bucle if(!exit_cikl)

si no

{

if(err != ERR_NO_ERROR)

{

Print("Error : " + IntegerToString(err));

}// si todavía hay un error if(err != ERR_NO_ERROR)

}// OTROS

if(err==ERR_NO_ERROR)

{

if( OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)

return(ticket);

}// si(err==ERR_NO_ERROR)

Print("Error al abrir la orden después de " + IntegerToString(cnt) +"intentos");

return(-1);

} //ciclo mientras

}// si el tipo de orden es de compra o de venta

return(ticket);

}// Función SendOrder


//-------------------------------------------------------------------------------------------------------------

//función modificar orden

//------------------------------------------------------------------------------------------------------------

ModifyOrder(int ticket,double price,double stoploss,double takeprofit,datetime expiration,color arrow_color)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

precio = NormalizarDoble(precio,Dígitos);

stoploss = NormalizeDouble(stoploss,Digits);

Beneficio = NormalizarDoble(Beneficio,Dígitos);

CheckValidStop(Symbol(),price,stoploss);//función para cambiar el stop mínimo

int err = GetLastError();

err = 0 ;

int Reintento = 10;

int cnt = 0;

bool exit_cikl = false;

resultado bool;

while(!exit_cikl)

{

result = OrderModify(ticket, price,stoploss,takeprofit,expiration, arrow_color);

err = GetLastError();

if(resultado == true)

{

Print("Pedido #"+ IntegerToString(ticket), "modificado con éxito");

return(true);

}

switch(err)

{

caso ERR_NO_ERROR:

exit_cikl = true;

romper;

{ caso ERR_SERVER_BUSY:

caso ERR_NO_CONNECTION:

caso ERR_INVALID_PRICE:

caso ERR_OFF_QUOTES:

caso ERR_BROKER_BUSY:

caso ERR_TRADE_CONTEXT_BUSY:

cnt++;

romper;

caso ERR_PRICE_CHANGED:

caso ERR_REQUOTE:

RefreshRates();

continuar;

por defecto:

exit_cikl = true;

romper;

}// switch(err)

}// while(!exit_cikl)

if ( err != ERR_NO_ERROR)

{

Print("Error al modificar el pedido # " + IntegerToString(ticket));

Print("Código de error: " + IntegerToString(err));

}

}//(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

si no

{

Print("Falló la selección del pedido, ticket = " + IntegerToString(ticket));

return(false);

}/si algo va mal

return(true);

}// función modificar

//----------------------------------------------------------------------------------------------------

//ChtckValidStop

//--------------------------------------------------------------------------------------------------

void CheckValidStop(string symbol,double price,double& sl)

{

si(sl==0)

volver;

double min_stop_server = MarketInfo(símbolo,MODE_STOPLEVEL)*MarketInfo(símbolo,MODE_POINT);

if(MathAbs(price-sl) <= min_stop_server)

{

if(precio>sl)

sl = precio - min_stop_server;

si no sl = sl + min_stop_server;

}// si(MathAbs(precio-sl) <= min_stop_server)

sl = NormalizeDouble(sl,MarketInfo(symbol,MODE_DIGITS))

}// función


 

POR FAVOR, ¡ACOMPÁÑENME!

Hay dos órdenes en el historial de operaciones: 1) VENDER № tic 415 STOPLOSS 1.1000 lote 0.01 2) VENDER № tic 418 STOPLOSS 1.1000 lote 0.02

Tengo que asignar las variables X=tick, Y=STOPLOSS y B=lote si el precio del Asc es igual al STOPLOSS de la orden de VENTA. Cómo asignar los primeros valores a la primera orden, y luego a la segunda. Conmigo siempre asigna un valor a la primera orden.

 
m8akca:

POR FAVOR, ¡ACOMPÁÑENME!

Hay dos órdenes en el historial de operaciones: 1) VENDER № tic 415 STOPLOSS 1.1000 lote 0.01 2) VENDER № tic 418 STOPLOSS 1.1000 lote 0.02

Tengo que asignar las variables X=tick, Y=STOPLOSS y B=lote si el precio del Asc es igual al STOPLOSS de la orden de VENTA. Cómo asignar los primeros valores a la primera orden, y luego a la segunda. Conmigo siempre asigna un valor a la primera orden.

Este tema está diseñado para ayudar a los que ya tienen algo escrito, pero no funciona del todo como yo quiero. Por favor, envíe su código para que los demás aquí puedan ver lo que está mal y ayudar.

Y si quieres que te escriban por encargo, ahí está.