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

 
//+------------------------------------------------------------------+
//| borrar y/o cerrar una orden, filtrada por volumen |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //lote mínimo que se va a borrar/cerrar
extern double MaxLot = 0.1; //lote máximo que se borra/desvía
extern bool Buy = false; //borrar/cerrar la dirección de las órdenes de compra
extern bool Sell = false; //borrar/cerrar la dirección de las órdenes de venta
extern bool pending = true; //borrar órdenes pendientes
extern bool market = true; //cerrar posiciones de mercado
extern int deslizamiento = 2; //deslizamiento del precio al cierre de las posiciones de mercado
//--------------------------------------------------------------------
int inicio()
{
doble SL,TP;
string txt=StringConcatenate("Script eliminar o cerrar orden, empezar ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
doble OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
si ((OrderSymbol() == Symbol())
{
OL = OrderLots();
si (OL<MinLot || OL>MaxLot) continuar;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
si (OT==OP_BUY)
{
error=CierreDeOrden(Billete,LotesDeOrden(),NormalizarDoble(Oferta,Dígitos),deslizamiento,Rojo);
if (error) txt = StringConcatenate(txt,"\nPedido de compra cerrado",Ticket);
else txt = StringConcatenate(txt,"\nError de cierre ",GetLastError());
}
si (OT==OP_SELL)
{
error=CierreDeOrden(Billete,LotesDeOrden(),NormalizarDoble(Demanda,Dígitos),deslizamiento,Azul);
if (error) txt = StringConcatenate(txt, "SELL order closed",Ticket;)
else txt = StringConcatenate(txt,"\nError ",GetLastError()," close ",Ticket);
}
si (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nOrderDeleted ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nError ",GetLastError()," eliminación ",StrOrdersType(OT)," ",Ticket);
}
si (!error)
{
Error = GetLastError();
si (Error<2) continuar;
si (Error==129)
{ Comentario("Precio incorrecto ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Dormir(5000);
RefreshRates();
continuar;
}
si (Error==146)
{
j++;
si (IsTradeContextBusy()) Sueño(2000);
continuar;
}
Comment("Error ",Error," cierre de la orden N ",OrderTicket(),
",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
si (OL<MinLot || OL>MaxLot) continuar;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
si (n==0) break;
nn++;
if (nn>10) {Comentario("No se han podido cerrar todas las operaciones, todavía hay ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nScript ha terminado su trabajo ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}

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

Qué debo añadir o cambiar en el script para cerrar todas las órdenes abiertas para todos los pares por tamaño de lote.

 
Vitek, ¡utiliza el botón SRC para insertar el código! ¿Quién necesita rebuscar entre garabatos ilegibles?
 
pu6ka:
Sí, los precios de Ask no son visibles, pero lo son :)
En el visualizador, puede pulsar la pausa y seleccionar "Mostrar la línea Ask" en las propiedades del gráfico y seguir probando. El gráfico de precios en MT4 se traza normalmente por Bid.

¿De qué depende la calidad de las pruebas y cómo se puede aumentar al máximo?
 
Zver4991:

¿y de qué depende la calidad de las pruebas y cómo se puede mejorar hacia el máximo?
Sinceramente, no lo sé. Todavía no lo he necesitado, búsquelo en la página web
 

Estimados profesionales.
¿Podríais decirme cómo abrir una parrilla de órdenes pendientes sin usar ciclos?
Si no es difícil, por favor muestre al menos un ejemplo aproximado de dicho código,
con la posibilidad de cambiar el paso y el tamaño del lote de cada orden sucesivo de la cuadrícula.

 
Forexman77:
Puse líneas

en lugar deint Ticket; salen errores:

'=' - paréntesis cuadrado izquierdo esperado para array('=' - paréntesis cuadrado izquierdo, esperado para array)

'>' - paréntesis cuadrado izquierdo esperado para la matriz ('=' - paréntesis cuadrado izquierdo esperado para la matriz)

'>' - token inesperado('>' - Token inesperado)

')' - asignación esperada('' - asignación esperada )

'continue' - 'break' o 'continue' utilizados sólo dentro de algunos bucles )

y mucho más.


Por lo tanto, el billete se sigue utilizando en alguna parte de la versión antigua. Tenemos que limpiar el código...
 
1mql:

Estimados profesionales.
¿Podríais decirme cómo abrir una parrilla de órdenes pendientes sin utilizar bucles?
Si no es difícil, por favor muestre al menos un ejemplo aproximado de dicho código,
Si puede cambiar el paso y el tamaño del lote de cada orden posterior en la parrilla.

Sí, en realidad, es lo mismo que en un bucle... ...pero sin el bucle. Muéstranos cómo abres en bucle y explica por qué no quieres usar bucles, porque no está claro lo que intentas conseguir.
 
borilunad:
Vitek, ¡utiliza el botón SRC para pegar el código! ¿Quién necesita rebuscar entre garabatos ilegibles?

//+------------------------------------------------------------------+
//| удаления и/или закрытие ордера, с фильтрацией его по объему |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //минимальный лот который удаляем/закываем
extern double MaxLot = 0.1; //максимальный лот который удаляем/закываем
extern bool Buy = false; //удалять/закрывать направление buy ордеров
extern bool Sell = false; //удалять/закрывать направление sell ордеров
extern bool pending = true; //удалить отложенные ордера
extern bool market = true ; //закрыть рыночные позиции
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций
//--------------------------------------------------------------------
int start()
{
double SL,TP;
string txt=StringConcatenate("Скрипт удаления или закрытие ордера, старт ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
double OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер BUY ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка закрытия ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер SELL ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," закрытия ",Ticket);
}
if (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nУдален ордер ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," удаления ",StrOrdersType(OT)," ",Ticket);
}
if (!error)
{
Error = GetLastError();
if (Error<2) continue;
if (Error==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Error==146)
{
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Error," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nСкрипт закончил свою работу ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}
//--------------------------------------------------------------------

Qué debo añadir o cambiar para cerrar todas las órdenes abiertas en todos los pares por tamaño de lote.

 
Vitek2010:

Qué debo añadir o cambiar para cerrar todas las órdenes abiertas en todos los pares por tamaño de lote.

Por debajo del último externo:
extern int deslizamiento = 2; // deslizamiento de precios al cerrar posiciones de mercado

inserta otro:
extern bool total_symb = true; //en todos los pares

y en cada línea:
si ((OrderSymbol() == Symbol())
и
if(OrderSymbol() == Symbol())

reemplazar con este:
if(OrderSymbol() == Symbol() || total_symb)

En teoría debería funcionar, compruébalo.

 
Ha surgido la pregunta, ¿es posible escribir un Asesor Experto o script, que sería lograr por ejemplo una pérdida del 2% en el día cerraría todas las transacciones?