¡Funcionó! Honestamente, tenía la idea de sustituir OR por AND.... pero ... :)))))))))))))))))))))
gracias ! ahora entiendo la logica, aunque para contar 15 cerrados, tendre que soplar el codigo al tamaño de un globo !
¿Se puede comprimir todo en un solo bucle y sustituir únicamente el parámetro del número de operaciones N necesarias?
Esta es una de las formas posibles de buscar las N órdenes cerradas más recientemente, y las órdenes buscadas pueden filtrarse por tipo (COMPRA, VENTA) y rentabilidad (deficitario, rentable):
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+//| Автор : TarasBY, taras_bulba@tut.by |//+-----------------------------------------------------------------------------------+//| Функция получает Ticket следующего перед fdt_Time закрытого ордера |//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+int fGet_TicketLastClosePos (int fi_Type = -2, // OrderType()int fi_TypeProfit = 0, // флаг профитности ордеров: 0 - все, -1 - убыточные, 1 - прибыльныеdatetime fdt_Time = 0) // Точка отсчёта времени
{
datetime ldt_CloseTime = 0, ldt_LastTime = 0;
double ld_Profit = 0.;
int li_Ticket = 0, li_Total = OrdersHistoryTotal();
//----for (int li_ORD = li_Total - 1; li_ORD >= 0; li_ORD--)
{
//if (!fCheck_MyOrders (li_ORD, fi_Type, MODE_HISTORY)) continue;
// Здесь прописываете свою фильтрацию ордеров
ldt_CloseTime = OrderCloseTime();
//---- Пропускаем ордера, закрытые после указанной датыif (fdt_Time != 0) if (fdt_Time <= ldt_CloseTime) continue;
if (ldt_LastTime >= ldt_CloseTime) continue;
ld_Profit = OrderProfit();
//---- Фильтруем ордера по профитностиif (fi_TypeProfit > 0) if (ld_Profit < 0.) continue;
if (fi_TypeProfit < 0) if (ld_Profit > 0.) continue;
ldt_LastTime = ldt_CloseTime;
li_Ticket = OrderTicket();
}
//----return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+//| Автор : TarasBY, taras_bulba@tut.by |//+-----------------------------------------------------------------------------------+//| Функция получает Tickets N закрытых ордеров |//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+int fGet_TicketsLastCloseOrd (int fi_NUM, // Количество искомых тикетовint& ar_Tickets[], // возвращаемый массив с тикетамиint fi_Type = -2, // OrderType()int fi_TypeProfit = 0) // флаг профитности ордеров: 0 - все, -1 - убыточные, 1 - прибыльные
{
int li_cnt = 0, li_Ticket;
datetime ldt_Time = 0;
//----for (int li_IND = 0; li_IND < fi_NUM; li_IND++)
{
li_Ticket = fGet_TicketLastClosePos (fi_Type, fi_TypeProfit, ldt_Time);
if (li_Ticket > 0)
{
li_cnt++;
ArrayResize (ar_Tickets, li_cnt);
ar_Tickets[li_cnt-1] = li_Ticket;
OrderSelect (li_Ticket, SELECT_BY_TICKET);
ldt_Time = OrderCloseTime();
}
elsebreak;
}
//----return (li_cnt);
}
Después de llamar a la función fGet_TicketsLastCloseOrd() y que ésta devuelva la cantidad de tickets encontrados según los parámetros especificados, se puede (yo lo haría) comprobar con la cantidad de tickets especificada (fi_NUM) y el valor devuelto por la función. Todos los tickets recogidos estarán en el array pasado a la función por referencia.
Y en esta variante no es importante, cuántas de estas últimas entradas se buscan. :)
Y si necesita beneficios por estas últimas órdenes cerradas, es aún más fácil:
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+//| Автор : TarasBY, taras_bulba@tut.by |//+-----------------------------------------------------------------------------------+//| Функция получает Profit N последних закрытых ордеров |//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+double fGet_ProfitLastCloseOrd (int fi_NUM, // Количество просчитываемых ордеровint fi_Type = -2) // OrderType()
{
int li_Ticket;
double ld_Profit = 0.;
datetime ldt_Time = 0;
//----for (int li_IND = 0; li_IND < fi_NUM; li_IND++)
{
li_Ticket = fGet_TicketLastClosePos (fi_Type, 0, ldt_Time);
if (li_Ticket > 0)
{
OrderSelect (li_Ticket, SELECT_BY_TICKET);
ldt_Time = OrderCloseTime();
ld_Profit += (OrderProfit() + OrderSwap() + OrderCommission());
}
elsebreak;
}
//----return (ld_Profit);
}
Aquí hay una de las formas posibles de buscar N tickets de las últimas órdenes cerradas, y puede filtrar las órdenes por tipo (COMPRA, VENTA) y por rentabilidad (deficitario, rentable):
Después de llamar a la función fGet_TicketsLastCloseOrd() y que ésta devuelva la cantidad de tickets encontrados según los parámetros especificados, se puede (yo lo haría) comprobar con la cantidad de tickets especificada (fi_NUM) y el valor devuelto por la función. Todos los tickets recogidos estarán en el array pasado a la función por referencia.
Y en esta variante no es importante, cuántas de estas últimas entradas se buscan. :)
Y si necesita beneficios por estas últimas órdenes cerradas, es aún más fácil:
Muchas gracias. Me tomaré un descanso, tengo que averiguar qué es lo que...
Hola, ayúdenme a resolver este problema: quiero que un indicador muestre los eurobucks, el índice del dólar y el índice del euro, pero sus valores son diferentes en varios órdenes. ¿Cómo puedo llevarlos a valores del mismo orden? Sólo hay que añadir multiplicadores, no creo que sea de mi gusto...
tommy27: Hola, ayúdenme a resolver este problema: quiero que un indicador muestre los eurobucks, el índice del dólar y el índice del euro, pero sus valores son diferentes en varios órdenes. ¿Cómo puedo llevarlos a valores del mismo orden? Creo que no es factible añadir multiplicadores...
Fijar los valores mínimos y máximos de todos los indicadores en el mismo valor
Buenos días a usted, mi consejo a un profesional: Escribí un indicador que las señales que quiero usar en mi EA. ¿Qué funcionará más rápido, la función de indicador o el indicador transferido?
Pero hace tiempo que uso la misma comparación sospechosa en otro código.
Y funciona con éxito.
int start()
{
double Price=iOpen (Symbol (),0,0); int last_order_bar = 0;
int ot = OrdersTotal();
if (ot>0) //если есть ордера в рынке
{
if (OrderSelect (ot-1,SELECT_BY_POS))
if (OrderType ()==OP_BUY || OrderType ()==OP_SELL )
last_order_bar = iBarShift (Symbol (),0,OrderOpenTime ());
}
int last_hist_order_bar = 0;
int oht = OrdersHistoryTotal();
if (oht>0)
{
if (OrderSelect (oht-1,SELECT_BY_POS, MODE_HISTORY))
if (OrderType ()==OP_BUY || OrderType ()==OP_SELL)
last_hist_order_bar = iBarShift (Symbol (),0,OrderOpenTime ());
}
if (ot==0 || last_order_bar>0) if (oht==0 || last_hist_order_bar>0)
//===============================================================if(Bid==Price)if((Minute( ) ==45)&&(Minute( ) <50))
int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,1,Bid-1500*Point,Bid+150*Point,"jfh",123 );
}
return;
No entiendo por qué esta condición no funciona en el último caso. No veo ninguna diferencia fundamental entre estos códigos.
¡Funcionó! Honestamente, tenía la idea de sustituir OR por AND.... pero ... :)))))))))))))))))))))
gracias ! ahora entiendo la logica, aunque para contar 15 cerrados, tendre que soplar el codigo al tamaño de un globo !
¿Se puede comprimir todo en un solo bucle y sustituir únicamente el parámetro del número de operaciones N necesarias?
Esta es una de las formas posibles de buscar las N órdenes cerradas más recientemente, y las órdenes buscadas pueden filtrarse por tipo (COMPRA, VENTA) y rentabilidad (deficitario, rentable):
Después de llamar a la función fGet_TicketsLastCloseOrd() y que ésta devuelva la cantidad de tickets encontrados según los parámetros especificados, se puede (yo lo haría) comprobar con la cantidad de tickets especificada (fi_NUM) y el valor devuelto por la función. Todos los tickets recogidos estarán en el array pasado a la función por referencia.
Y en esta variante no es importante, cuántas de estas últimas entradas se buscan. :)
Y si necesita beneficios por estas últimas órdenes cerradas, es aún más fácil:
Aquí hay una de las formas posibles de buscar N tickets de las últimas órdenes cerradas, y puede filtrar las órdenes por tipo (COMPRA, VENTA) y por rentabilidad (deficitario, rentable):
Después de llamar a la función fGet_TicketsLastCloseOrd() y que ésta devuelva la cantidad de tickets encontrados según los parámetros especificados, se puede (yo lo haría) comprobar con la cantidad de tickets especificada (fi_NUM) y el valor devuelto por la función. Todos los tickets recogidos estarán en el array pasado a la función por referencia.
Y en esta variante no es importante, cuántas de estas últimas entradas se buscan. :)
Y si necesita beneficios por estas últimas órdenes cerradas, es aún más fácil:
Muchas gracias. Me tomaré un descanso, tengo que averiguar qué es lo que...
Hola, ayúdenme a resolver este problema: quiero que un indicador muestre los eurobucks, el índice del dólar y el índice del euro, pero sus valores son diferentes en varios órdenes. ¿Cómo puedo llevarlos a valores del mismo orden? Creo que no es factible añadir multiplicadores...
Fijar los valores mínimos y máximos de todos los indicadores en el mismo valor
Buenos días a usted, mi consejo a un profesional: Escribí un indicador que las señales que quiero usar en mi EA. ¿Qué funcionará más rápido, la función de indicador o el indicador transferido?
Gracias
establecer el mínimo y el máximo de todos los indicadores en el mismo valor
Cuáles... Quiero que todo esto se muestre con un indicador para 3 topes droline.
tommy27:
¿Cómo llevarlos a valores del mismo orden?
la escala debe ser la misma
Sí, y para ello tiene sentido convertir los tres valores del buffer antes de mostrarlos así:
Xn=(X-Xmin)/(Xmax-Xmin)
Si se hace esto de forma contundente, se obtiene algo que parece una línea horizontal.
Bueno, si usas el escalado de MQ, estás bien.
Si ocurre, no será pronto, quizá nunca.
Gracias por la respuesta.
Pero hace tiempo que uso la misma comparación sospechosa en otro código.
Y funciona con éxito.
No entiendo por qué esta condición no funciona en el último caso. No veo ninguna diferencia fundamental entre estos códigos.