[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 591

 
vik-777:

Ayúdame a resolver un problema

Muestro todos los artículos cerrados

for (int i=0; i<OrdersHistoryTotal(); i++)// Para todos los pedidos
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)

luego filtrar por número mágico

if (OrderMagicNumber()==12)

El filtro satisface 3 posiciones, pero sólo necesito la última cerrada

no se sabe cómo dejar sólo el último?

Gracias

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара закрытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}
Lo que es relevante para su pregunta está subrayado.
 

De nuevo, muy necesario.

Ayúdame a resolver el problema.

Estoy seleccionando por todas las posiciones cerradas

for (int i=0; i<OrdersHistoryTotal(); i++)// en todos los pedidos del terminal
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)

filtro posterior por número mágico

if (OrderMagicNumber()==12)

el filtro coincide con 3 posiciones pero sólo necesito la última cerrada

¿No puedes averiguar cómo dejar sólo el último?

Gracias

 
- Es bueno ser tonto! Tumtz-tumtz (letra de una canción)
 

¡Por favor, ayuda! Necesito que abra la orden inmediatamente después de cerrar la anterior, al precio Tp o SL.

#property copyright "Copyright © 2010, MetaQuotes Software Corp.
#enlace de propiedad "http://www.metaquotes.net"
#property show_confirm
extern int MaxRisk=3;
extern bool Buy=false; //para abrir una orden de compra
extern bool Sell=true; //para abrir una orden de venta.
extern inttern MagicNumber=7749;
extern TP=210;
extern inttern SL=420;

{
double point=MarketInfo(Symbol(),MODE_POINT);//solicitar Punto
double Free=AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lote =MathFloor(Libre*Riesgo Máximo/100/Un_Lote/Paso)*Paso;
int pos,total=Total de pedidos();
//----

if(Buy==true && OrdersTotal()<=1)
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-SL*Point,Ask+TP*Point, "777"+ Symbol(), MagicNumber, 0, DarkGreen);

Comprar=falso;
}
if(Sell==true && OrdersTotal()<=1)
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+SL*Point,Bid-TP*Point, "4949"+ Symbol(), MagicNumber, 0, DarkGreen);

Vender=falso;
}

for (pos=0; pos<total; pos++)
if(OrderSelect(pos,SELECT_BY_POS )==true)

if(OrdersTotal()==OP_BUY)
if(PRICE_CLOSE==OrderTakeProfit()) Buy=true;
if(PRICE_CLOSE==OrderStopLoss()) Vender=verdadero;

}
}

if(OrderSelect(pos,SELECT_BY_POS )==true)
if (OrdersTotal()==OP_SELL)
{
if(PRICE_CLOSE==OrderStopLoss()) Buy=true;
if(PRICE_CLOSE==OrderTakeProfit()) Vender=verdadero;

}
} }

//----
return(0);
}
//+------------------------------------------------------------------+




 

Chicos, una pregunta, un EA intenta abrir una orden, pero el precio cambia y muestra un error de precio erróneo, ¿cómo puedo evitarlo, para que intente comprar hasta que compre?

void CLOSEORDER(string ord)
{
   for (int i=0; i<OrdersTotal(); i++)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUY && ord=="Buy")
            OrderClose(OrderTicket(),OrderLots(),Bid,30,CLR_NONE);// Закрываем Buy
         if (OrderType()==OP_SELL && ord=="Sell")
            OrderClose(OrderTicket(),OrderLots(),Ask,30,CLR_NONE);// Закрываем Sell
      }   
   }
}
//--------------------------------------------------------------------
void OPENORDER(string ord)
{
   int error;
   if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, LOT,Ask,20,SL,TP,"", 1,3);
   if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,LOT,Bid,20,SL,TP,"",-1,3);
   if (error==-1) //неудачная покупка OK
   {  
      ShowERROR(error,0,0);
   }

Solía serlo.

Bid,3,CLR_NONE

Añadí 30 porque tengo un signo de 5 pero es inútil.

 
vik-777:

De nuevo, muy necesario.

Ayúdame a resolver el problema.

Estoy probando todos los artículos cerrados.



Empieza por el final, entonces el primero que coincida es el elegido.

for (int i=OrdersHistoryTotal()-1;i>=0; i--)//
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)


 
Craft:

Todavía hay una molestia más, hay secciones en las que sólo hay un cierre de una posición y no una inversión, aunque las condiciones para un stop y la apertura de una nueva posición son las mismas.


Estas situaciones pueden ocurrir porque las condiciones de compra y venta en el Asesor Experto no son mutuamente excluyentes. Intente trazar los valores de las variables requeridas en el probador según

if(Time[0]=='время_нужного_бара') //чтоб не засорять логи берем на конкретном баре - посмотрите на картинке, где именно ошибка
{
   Print("переменная=", значение);
}
 
Pyxlik2009:

Chicos, una pregunta, un EA intenta abrir una orden, pero el precio cambia y muestra un error de precio erróneo, ¿cómo puedo evitarlo, para que intente comprar hasta que compre?

Solía serlo.

Añadí 30 porque tengo un signo de 5 pero es inútil.

Hacer una orden while(true), comprobar si hay 135 errores y luego RefreshRates(). Mira, hay scripts con ejemplos en el paquete con el terminal, todo está explicado allí.
 
alsu:

esto debe ser investigado en detalle, tales situaciones pueden surgir porque las condiciones de apertura de compra y venta en el EA no son mutuamente excluyentes. Trate de trazar los valores de las variables requeridas en el probador a lo largo de las líneas de

Bien, ¿en qué parte del código debe insertarse esto, cómo se aplica en la práctica?
 
SergNF:

Lo que es relevante para su pregunta está subrayado.
Así que selecciono el último orden cerrado y necesito el último cerrado con el mago, por ejemplo son las líneas 3,6 y 9 por lo tanto necesito la línea 3 ya que es la última cerrada con el mago