Esto es lo que obtengo cuando el EA funciona en el probador:
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1 sell limit 2.00 EURUSD at 1.27972 ok 2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert: OrderExpiration = 2012.01.11:12:00 2013.03.01 12:45:58 2012.01.12 16:29 Probador: la orden #1, vender 2.00 EURUSD se abre a 1.27972
Es decir, la fecha y la hora de vencimiento se establecen correctamente, como quiero, pero no hay cierre en el momento del vencimiento - una posición se abre después de 24 horas.
He buscado en algunos foros y el problema se produce. Las respuestas habituales son "a mí me funciona" o "rastrea tú mismo las órdenes pendientes". No quiero seguirlos yo mismo y no me funciona.
borilunad: Lo he observado en modo visual y casi todos los cierres dobles son los últimos, los anteriores están cerrados por SL y TP, es decir, no hay nada que elegir. He eliminado las paradas y las tomas para tener algo que elegir. ¡Mañana mostraré su Asesor Experto con todas las funciones adicionales y comentarios! Podrás comprobar por ti mismo cómo funciona. ¡Quiero que se demuestre que me he equivocado! Si tengo razón, ¡intentaré hacerlo lo mejor posible! ¡Hasta mañana!
Sergey, Dubakin He hecho una comprobación visual y me he asegurado de que esta función selecciona los máximos, que es lo que necesitaba. Me alegro de que ya no tenga dudas, ¡y mis disculpas a usted! Pero en nuestro negocio "es mejor medir siete veces..." Mostrando a su probador EA para la comprobación de funciones, con características y comentarios añadidos para una comprobación visual más clara. Gracias.
externint EA_Magic=135; // внешняя переменнаяint TimeNow, TimePrev, PrevType; // глобальные переменныеint start()
{
double Price,SL,TP;
int Ticket;
TimeNow=iTime(NULL,240,0);
if(TimePrev==TimeNow) return(0);
if(PrevType!=1) {
Price=NormalizeDouble(Ask,Digits);
// SL=NormalizeDouble(Price-300*Point,Digits); // TP=NormalizeDouble(Price+300*Point,Digits);
Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,0,0,"",EA_Magic);
if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }
elseif(PrevType!=-1) {
Price=NormalizeDouble(Bid,Digits);
// SL=NormalizeDouble(Price+300*Point,Digits); // TP=NormalizeDouble(Price-300*Point,Digits);
Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,0,0,"",EA_Magic);
if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }
Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
"; LotPos: ",GetAmountLotFromOpenPos(),
"\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
"\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));
if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);
return(0);
}
bool LockOFF(int EA_Magic) {
double Result, PrevLoss, PrevProfit;
int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
bool Ans;
MaxProfitTicket=-1; MaxLossTicket=-1;
orders_total=OrdersTotal();
for(pos=orders_total-1; pos>=0; pos--) {
if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордерif(OrderType()>1) continue;
Result=OrderProfit()+OrderSwap()+OrderCommission();
if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); // end of for
} }
if(MaxLossTicket==-1) return(false); // нет убыточной позицииif(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY;
orders_total=OrdersTotal();
for(pos=orders_total-1; pos>=0; pos--) {
if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордерif(order_type!=OrderType()) continue;
Result=OrderProfit()+OrderSwap()+OrderCommission();
if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
PrevProfit=Result; MaxProfitTicket=OrderTicket(); // end of for
} }
if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции
Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
if(!Ans) {
Print("Ошибка при встречном закрытие!"); return(false);
}
return(true);
}
//+----------------------------------------------------------------------------+int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY) {
if (op<0 || OrderType()==op) {
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
l+=OrderLots();
} } } }
return(l);
}
//+----------------------------------------------------------------------------+double GetMinProfit(string sy="", int op=-1, int mn=-1) {
double p;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (p>OrderProfit()+OrderCommission()+OrderSwap())
p=OrderProfit()+OrderCommission()+OrderSwap();
} } } }
return(p);
}
//+----------------------------------------------------------------------------+double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
double p;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (p<OrderProfit()+OrderCommission()+OrderSwap())
p=OrderProfit()+OrderCommission()+OrderSwap();
} } } }
return(p);
}
//+----------------------------------------------------------------------------+
Sergey, Dubakin He hecho una comprobación visual y me he asegurado de que esta función selecciona los máximos, que es lo que necesitaba. Me alegro de que ya no tenga dudas, ¡y mis disculpas a usted! Pero en nuestro negocio "es mejor medir siete veces..." Mostrando a su probador EA para la comprobación de funciones, con características y comentarios añadidos para una comprobación visual más clara. Gracias.
Cómo así... Basado en Igor Kim hizo algo... Sólo una de sus características... el resto es lo mismo...
//+----------------------------------------------------------------------------+int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY) { // тут жесткая проверка на тип Buy
if (op<0 || OrderType()==op) { // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+
algo así, supongo:
//+----------------------------------------------------------------------------+int NumberOfPositions(string sy, int op, int mn) {
int i, k=OrdersTotal()-1, kp=0;
for (i=k; i>=0; i--) {
if (OrderSelect(i,SELECT_BY_POS)) { // если ордер выбран
if (OrderMagicNumber()!=mn) continue; // если не наш магик - смотрим следующий ордер
if (OrderSymbol()!=sy) continue; // если не наш символ - смотрим следующий ордер
if (OrderType()!=op) continue; // если не соответствует тип - смотрим следующий
kp++; // тут искомый ордер - увеличим счётчик
}
}
return(kp);
}
//+----------------------------------------------------------------------------+
Y llámala:
para contar la compra y la venta por el símbolo actual, con Magic
//+----------------------------------------------------------------------------+int BuyPos= NumberOfPositions(Symbol(), OP_BUY, Magic);
int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
La variable i tiene un valor de 0 sólo al principio del bucle. Además, añadirá 1 valor con cada iteración.
Entonces hay una condición que hará que el bucle continúe:
min>OrderLots()
Pero min se declara como cero y su valor no cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?
He estado navegando por el hilo. Su lógica es extraña. Me interesa la última línea de código:
La variable i tiene un valor de 0 sólo al principio del bucle. Además, añadirá valor con cada iteración por 1.
Entonces hay una condición para que el ciclo continúe:
Pero min está declarado como cero, y su valor nunca cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?
int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
Si lo hacemos así, todas las cosas extrañas deberían desaparecer.
Miré a través de la rama. Su lógica es extraña. Me interesa la última línea de código:
La variable i tiene valor 0 sólo al principio del bucle. Además, añadirá valor con cada iteración por 1.
Entonces hay una condición para que el ciclo continúe:
Pero min está declarado como cero, y su valor nunca cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?
Igor Kim tiene un asesor que hace lo siguiente en un intervalo determinado
Gracias.
Hola.
Problema con las órdenes pendientes, concretamente con la fecha de caducidad.
Así se abre una nueva orden, es decir, si no se ha activado en una hora, el servidor debe cerrarla.
Entonces compruebo cuál es la fecha de caducidad:
Esto es lo que obtengo cuando el EA funciona en el probador:
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1 sell limit 2.00 EURUSD at 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert: OrderExpiration = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 Probador: la orden #1, vender 2.00 EURUSD se abre a 1.27972
Es decir, la fecha y la hora de vencimiento se establecen correctamente, como quiero, pero no hay cierre en el momento del vencimiento - una posición se abre después de 24 horas.
He buscado en algunos foros y el problema se produce. Las respuestas habituales son "a mí me funciona" o "rastrea tú mismo las órdenes pendientes". No quiero seguirlos yo mismo y no me funciona.
Igor Kim tiene un asesor que hace lo siguiente en un intervalo determinado
Funciona muy bien.
Gracias por el consejo.
Funciona muy bien.
Gracias por el consejo.
No soy yo, es Google.
Creo que puedes sacar la función de guardar la pantalla desde allí y establecer tus propios parámetros para llamarla - me dio mucha pereza...
Lo he observado en modo visual y casi todos los cierres dobles son los últimos, los anteriores están cerrados por SL y TP, es decir, no hay nada que elegir. He eliminado las paradas y las tomas para tener algo que elegir. ¡Mañana mostraré su Asesor Experto con todas las funciones adicionales y comentarios! Podrás comprobar por ti mismo cómo funciona. ¡Quiero que se demuestre que me he equivocado! Si tengo razón, ¡intentaré hacerlo lo mejor posible! ¡Hasta mañana!
Sergey, Dubakin He hecho una comprobación visual y me he asegurado de que esta función selecciona los máximos, que es lo que necesitaba. Me alegro de que ya no tenga dudas, ¡y mis disculpas a usted! Pero en nuestro negocio "es mejor medir siete veces..." Mostrando a su probador EA para la comprobación de funciones, con características y comentarios añadidos para una comprobación visual más clara. Gracias.
Sergey, Dubakin He hecho una comprobación visual y me he asegurado de que esta función selecciona los máximos, que es lo que necesitaba. Me alegro de que ya no tenga dudas, ¡y mis disculpas a usted! Pero en nuestro negocio "es mejor medir siete veces..." Mostrando a su probador EA para la comprobación de funciones, con características y comentarios añadidos para una comprobación visual más clara. Gracias.
Cómo así... Basado en Igor Kim hizo algo... Sólo una de sus características... el resto es lo mismo...
algo así, supongo:
Y llámala:
para contar la compra y la venta por el símbolo actual, con Magic
¿Puedes decirme cómo elegir el lote más pequeño entre todas las operaciones abiertas?
double min=0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
La variable i tiene un valor de 0 sólo al principio del bucle. Además, añadirá 1 valor con cada iteración.He estado navegando por el hilo. Su lógica es extraña. Me interesa la última línea de código:
Entonces hay una condición que hará que el bucle continúe:
Pero min se declara como cero y su valor no cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?
La variable i tiene un valor de 0 sólo al principio del bucle. Además, añadirá valor con cada iteración por 1.He estado navegando por el hilo. Su lógica es extraña. Me interesa la última línea de código:
Entonces hay una condición para que el ciclo continúe:
Pero min está declarado como cero, y su valor nunca cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?
La variable i tiene valor 0 sólo al principio del bucle. Además, añadirá valor con cada iteración por 1.Miré a través de la rama. Su lógica es extraña. Me interesa la última línea de código:
Entonces hay una condición para que el ciclo continúe:
Pero min está declarado como cero, y su valor nunca cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?Tenga en cuenta
Si min>OrderLots(), entonces min = OrderLots();
Tenga en cuenta
Si min>OrderLots() entonces, min = OrderLots();