[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 69

 
Por favor, que alguien mire mi post anterior (en la página 67). No encuentro el error: las órdenes pendientes no se fijan.
 
nemo811:
Por favor, que alguien mire mi post anterior (en la página 67). No encuentro el error: las órdenes pendientes no se fijan.

No hay ningún error. Deberías tener más cuidado.

#property copyright "Copyright © 2010, Хлыстов Владимир"
#property link "cmillion@narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern int stoploss = 0; //уровень выставления SL, если 0, то SL не выставляется
extern int takeprofit = 0; //уровень выставления TP, если 0, то TP не выставляется
extern int Magic = 123456; //уникальный номер ордера
extern bool BUY = false; //открыть ордер BUY
extern bool SELL = false; //открыть ордер SELL
extern bool BUYSTOP = false; //открыть ордер BUYSTOP
extern bool SELLSTOP = false; //открыть ордер SELLSTOP
extern double Lot = 0.1; //объем ордера
extern int slippage = 3; //Максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");
}
if (SELL)
{ 
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0; 
OPENORDER ("Sell");
}
if (BUYSTOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy Stop");
}
if (SELLSTOP)
{ 
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0; 
OPENORDER ("Sell Stop");
}
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(string ord)
{
int error,err;
while (true)
{ error=true;
if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"BUY",Magic,0,Blue);
if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,"SELL",Magic,0,Red);
if (ord=="BuyStop" ) error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask,Digits),SL,TP,"BUYSTOP",Magic,0,Blue);
if (ord=="SellStop") error=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid,Digits),SL,TP,"SELLSTOP",Magic,0,Red);
if (error==-1) //неудачная покупка OK
{ 
ShowERROR();
err++;Sleep(2000);RefreshRates();
}
if (error || err >10) return;
}
return;
} 
//--------------------------------------------------------------------
void ShowERROR()
{
int err=GetLastError();
switch ( err )
{ 
case 1: return;
case 2: Alert("Нет связи с торговым сервером ",Symbol());return;
case 3: Alert("Error неправильные параметры ",Symbol());return;
case 130: Alert("Error близкие стопы Ticket ",Symbol());return;
case 134: Alert("Недостаточно денег ",Symbol());return;
case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
case 129: Alert("Error Неправильная цена ",Symbol());return;
case 131: Alert("Error Неправильный объем ",Symbol());return;
case 4200:Alert("Error Объект уже существует ",Symbol());return;
default: Alert("Error ",err," ",Symbol());return;
}
}
//--------------------------------------------------------------------
 
gince:

No hay ningún error. Hay que tener más cuidado


No, no, no, no. Estás mirando el puesto equivocado. Hay otro justo debajo :)). La versión que ha comprobado no especifica el nivel a partir del precio actual (sólo el precio actual) en el que debe fijarse el péndulo. Gracias por sus comentarios.
 
nemo811:

No, no, no. Te has equivocado de puesto. Hay otro justo debajo :)). La versión que ha comprobado no muestra el nivel a partir del precio actual (sólo muestra el precio actual), en el que debería fijarse la pechina. Gracias por sus comentarios.

Algo con la llamada a la función OPENORDER() o la propia función.

Funciona así

si (BUYSTOP)

{

if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;

if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;

int error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);

}

 
gince:

Algo con la llamada a la función OPENORDER() o la propia función.

Funciona así

si (BUYSTOP)

{

if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;

if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;

int error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);

}


¡¡¡Aaaaaaaaah!!! ¡¡Dioses de la informática!! ¡Lo he pasado diez veces! ¿Por qué no funciona? Lo principal es la apertura del mercado. Los pendientes se escriben exactamente con el mismo principio. ¿Qué le falta? :)))))))
 

Por favor, aconsejar cómo insertar TrailingStopFrCnSAR_v2 en Expert Advisor, que se describe en el tutorial?

¿Cómo desactivo el seguimiento de órdenes, para que funcione cuando otro EA ponga una orden pendiente o abra una orden?

Archivos adjuntos:
 

¡¡¡¡¡¡¡¡Urrrrrrra!!!!!!!! ¡Encontré el error!

Si alguien está interesado, aquí hay una versión que funciona:

#property copyright "Copyright © 2010, Khlystov Vladimir"
#p

roperty link "cmillion@narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern int stoploss = 0; //nivel de exposición del SL, si es 0, el SL no está expuesto
extern int int takeprofit = 0; //t Nivel de TP, si es 0, el TP no se exhibe
extern int Magic = 123456; //número de una orden
extern bool BUY = false; //abrir orden de COMPRA
extern bool SELL = false; //abrir orden de VENTA
extern bool BUYSTOP = false; //abrir orden BUYSTOP
extern bool SELLSTOP = false; //abrir orden SELLSTOP
extern double Lote = 0.1; // volumen del pedido
extern int slippage = 3; //desviación de precio máxima permitida para las órdenes de mercado
extern int DistanceSet = 20; //Distancia de mercado
//--------------------------------------------------------------------
doble SL,TP;
//--------------------------------------------------------------------
int inicio()
{
si (COMPRA)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;
OPENORDER ("Comprar");
}
si (VENTA)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0;
OPENORDER ("Venta");
}
si (BUYSTOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;
OPENORDER ("Buy Stop");
}
si (SELLSTOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); si no SL=0;
OPENORDER ("Sell Stop");
}
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(string ord)
{
int error,err;
mientras (verdadero)
{ error=true;
if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,",Magic,0);
if (ord=="Buy Stop" ) error=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),slippage,SL,TP,"",Magic,0);
if (ord=="Sell Stop") error=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),slippage,SL,TP,",Magic,0);
if (error==-1) //fallo
{
MostrarERROR();
err++;Sleep(2000);RefreshRates();
}
if (error || err >10) return;
}
volver;
}
//--------------------------------------------------------------------
void ShowERROR()
{
int err=GetLastError();
switch ( err )
{
caso 1: retorno;
caso 2: Alert("No hay conexión con el servidor de comercio ",Symbol());return;
caso 3: Alert("Error parámetros incorrectos ",Symbol());return;
caso 130: Alert("Error al cerrar las paradas de los billetes ",Symbol());return;
caso 134: Alert("No hay suficiente dinero ",Symbol());return;
caso 146: Alert("Error Trade Subsystem is busy ",Symbol());return;
caso 129: Alert("Error Precio erróneo ",Symbol());return;
caso 131: Alert("Error Volumen incorrecto ",Symbol());return;
case 4200:Alert("Error El objeto ya existe ",Symbol());return;
por defecto: Alert("Error ",err," ",Symbol());return;
}
}
//--------------------------------------------------------------------

¡¡¡Muchas gracias a todos los que han participado en el debate!!! Sin ti no hay nada. :)))))

 
nemo811:

¡¡¡¡¡¡¡¡Urrrrrrra!!!!!!!! ¡He encontrado el error!


Muchas gracias a todos los que han participado en el debate. Sin ti no hay nada. :)))))

todavía tienes un error en tu código.

Recuerde: los stops y las tomas en las órdenes pendientes no se cuentan desde el precio actual, sino desde el precio de apertura de la orden.

 

¡AYUDA! Por favor, dígame, si cierro parte de una posición (por ejemplo, orden de 1 lote, y cerrar 0,5 lotes) OrderClose billete debe cambiar? Mi probador dice que sí... ¿Cómo evitarlo? A continuación se muestra un trozo de código para cerrar...

1 2011.01.31 06:57 vender 1 2.55 1.36177 0.00000 0.00000 0.00 10000.00
2 2011.01.31 08:10 cerrar 1 0.51 1.36039 0.00000 0.00000 70.38 10070.38
3 2011.01.31 08:10 vender 2 2.04 1.36177 0.00000 0.00000 0.0000 10070.38
4 2011.01.31 08:10 cierre 2 0.40 1.36038 0.00000 0.00000 55.60 10125.98
5 2011.01.31 08:10 venta 3 1.64 1.36177 0.00000 0.00000 0.0000 10125.98

Otra pregunta: quiero dividir mi orden en 4 partes y cerrar cada una de ellas cuando Cls_S==true se active. Intenté usar el contador... No funciona...

¿Alguien puede darme una idea?

¡¡¡¡Gracias de antemano!!!!

if (Tip==1 && ((Cls_S0==true&&TotClS==0)||(Cls_S1==true&&TotClS==1)
||(Cls_S2==true&&TotClS==2)||(Cls_S3==true&&TotClS==3)) // Se abre una orden de venta.
{ // y hay un criterio para cerrarlo
Alert("Intentando cerrar la venta de 0,2 lotes ",Ticket,". Esperando respuesta...");
RefreshRates(); // Refrescar datos
Ans=OrderClose(Ticket,LotCt,Ask,5);

if (Ans==true) // Ha funcionado :)
{
TotClS++;
Alert ("Cerrado 0.2 Lote Venta ",Ticket);
break; // Salir del bucle cerrado
}
if (Fun_Error(GetLastError())==1) // Gestión de errores
continue; // Reintentar
return; // Salir de start()
}
break; // Salir mientras

 
gince:
He hecho un dibujo temporal del buffer flag[] - está vacío, pero ¿por qué? ¿Dónde está mi error?
No lo sé. Sergeev sabe, dijo que parece estar bien. También me gustaría ver cómo se escribe correctamente.
Sólo lo he corregido un poco, para que se vea algo.
- Pongo el indicador en una ventana separada, luego puedes volver a ponerlo

- array macd[] estaba colgado en el aire, lo convirtió en un indicador, aumentó la precisión
- arregló su condición compleja para abrir, puso una simple para el ajuste
- cambió la condición de la bandera, así que al menos funciona.

Entonces puedes introducir gradualmente las condiciones, verás inmediatamente dónde está el fallo.

Archivos adjuntos: