[¡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 616

 
Naturalmente, tienes razón. La implicación era que ya tiene un código para tomar lecturas sólo una vez por barra.
 
sllawa3:
Creo que tienes razón... Yo también tengo mis dudas...

De este modo, se puede controlar la equidad para cerrar todas las posiciones y eliminar las órdenes en cuanto se alcance el porcentaje especificado de beneficio de la equidad:

//--------------------------------------------------------------
// Описание глобальных переменных советника
// ----------------- Трал эквити -------------
extern double  PercentEquityForClose=15;
double         Equ_OLD,
               Equ_NEW,
               EquPerc,
               Equ_Start;

// ---- Дальнейшее описание глобальных переменных советника

//==========================================================

int init()                             // Функция init
{
   Equ_OLD=AccountEquity();
   Equ_Start=Equ_OLD; 
   EquPerc=Equ_Start/100*PercentEquityForClose;
   
// ---- Дальнейший код функции ----

   return;                             // Выход из init() 
}

//==========================================================
// ---- В функции слежения за событиями ----
// ---- вызываемой из функции start ----

   Equ_NEW=AccountEquity();                              // С новым тиком запоминаем текущее значение эквити
   if (Equ_OLD!=Equ_NEW)                                 // Если новое значение не равно старому, то
         {
            if (Equ_NEW>=Equ_OLD+EquPerc)                // Если эквити увеличилось по отношению к своему прошлому значению на EquPerc процентов,
               {                                         
                  ClosePosFirstProfit(NULL, -1, -1);     // то закрываем все позиции
                  DeleteOrders(NULL, -1, -1);            // и удаляем все ордера
                  Equ_NEW=AccountEquity();               // Запоминаем текущее значение эквити
                  Equ_OLD=Equ_NEW;                       // и заносим его в "прошлое" значение для проверки на изменение на след. тике
               }
         }

Lo escribí sobre la marcha, así que puede haber errores.
Para seguir los cambios en la equidad en cada barra, sólo hay que comprobar la apertura de una nueva barra y si es así, se debe ejecutar este fragmento de código:

   Equ_NEW=AccountEquity();                              // С новым тиком запоминаем текущее значение эквити
   if (Equ_OLD!=Equ_NEW)                                 // Если новое значение не равно старому, то
         {
            if (Equ_NEW>=Equ_OLD+EquPerc)                // Если эквити увеличилось по отношению к своему прошлому значению на EquPerc процентов,
               {                                         
                  ClosePosFirstProfit(NULL, -1, -1);     // то закрываем все позиции
                  DeleteOrders(NULL, -1, -1);            // и удаляем все ордера
                  Equ_NEW=AccountEquity();               // Запоминаем текущее значение эквити
                  Equ_OLD=Equ_NEW;                       // и заносим его в "прошлое" значение для проверки на изменение на след. тике
               }
         }

Creo que es algo así...

 
Roger:
Naturalmente, tienes razón. La implicación era que ya tiene un código para tomar lecturas sólo una vez por barra.
No, no lo sé, pero escribí algo más arriba para comprobar la equidad en cada tic. Sólo hay que hacer una comprobación de la apertura de un nuevo bar y si es así... No creo que sea difícil de hacer...
 
interesado en que la equidad pase de ser ascendente a descendente, siempre que la equidad esté por encima del equilibrio... para cerrar cualquier cosa abierta...
 
sllawa3:
Me interesa que el patrimonio pase de ser creciente a ser decreciente, siempre que el patrimonio sea mayor que el saldo... para cerrar todo lo que está abierto...

Esta es la función para definir una nueva barra:

//+------------------------------------------------------------------+
//|  возвращает признак появления нового бара для указанного периода |
//+------------------------------------------------------------------+
bool isNewBar(int timeFrame)
   {
   bool res=false;
   
   // массив содержит время открытия текущего (нулевого) бара
   // по 7 (семь) таймфреймам
   static datetime _sTime[7];  
   int i=6;
 
   switch (timeFrame) 
      {
      case 1  : i=0; break;
      case 5  : i=2; break;
      case 15 : i=3; break;
      case 30 : i=4; break;
      case 60 : i=5; break;
      case 240: break;
      case 1440:break;
      default:  timeFrame = 1440;
      }
//----
   if (_sTime[i]==0 || _sTime[i]!=iTime(Symbol(),timeFrame,0))
      {
      _sTime[i] = iTime(Symbol(),timeFrame,0);
      res=true;
      }
      
//----
   return(res);   
   }
   

... interesado en que la equidad pase de subir a bajar mientras la equidad esté por encima del equilibrio... para cerrar todo lo que esté abierto...

Entonces tenemos que comprobar la equidad en cada tic. Al fin y al cabo, si se trabaja por ticks, por ejemplo, una hora antes de la siguiente comprobación de la renta variable, ésta puede perder su valor...

Por lo tanto, no debemos comparar el aumento de la equidad en un 1%, sino su aumento o disminución en relación con el estado en el tick anterior, registrado en la variable Equ-OLD con su valor actual en Equ_NEW

 
sllawa3:
interesado en que la equidad pase de ser ascendente a descendente, siempre que la equidad esté por encima del equilibrio... para cerrar todo lo abierto...

En algún lugar como este:

   Equ_NEW=AccountEquity();                              // С новым тиком запоминаем текущее значение эквити
   if (Equ_OLD!=Equ_NEW)                                 // Если новое значение не равно старому, то
         {
            if (NormalizeDouble(Equ_NEW-Equ_OLD,8)<0)    // Если эквити уменьшилось по отношению к своему прошлому значению,
               {                                         
                  ClosePosFirstProfit(NULL, -1, -1);     // то закрываем все позиции
                  DeleteOrders(NULL, -1, -1);            // и удаляем все ордера.
                  Equ_NEW=AccountEquity();               // Запоминаем текущее значение эквити
                  Equ_OLD=Equ_NEW;                       // и заносим его в "прошлое" значение для проверки на изменение на след. тике
               }
         }

// (NormalizeDouble(Equ_NEW-Equ_OLD,8)<0) - возможно здесь нужно сравнивать не с нулём, а с каким-то числом, 
                                         // а то может в последующем и не дать увеличиться балансу, 
                                         // постоянно закрывая вновь открываемые позиции (они ведь требуют залога)

Sin embargo, esto es sólo información para pensar, no un código listo...

 
drknn:

Claro que sí. Solo que no se llama stop, se llama orden pendiente. Abre un terminal. Pulsa F1 en él. En la ventana que aparece abra Contenido - Comercio - Tipos de órdenes.

)))) gracias, pero después de los fondos confundido / ejecución desacostumbrado por las ofertas y pide en lugar de las operaciones, cuando algo confuso - no tímido para hacer pregunta estúpida para eliminar las dudas. )))
 

Ayuda . el distribuidor tiene cinco decimales . la función iOpen (NULL,0,n) da sólo cuatro decimales (las lecturas se toman a través de la impresión) . cómo resolver el problema .

 
pips500:

Ayuda . el distribuidor tiene cinco decimales . la función iOpen(NULL,0,n) da sólo cuatro decimales (las lecturas se toman a través de la impresión) . cómo puedo resolver el problema . gracias de antemano.

Print() redondea a 4 dígitos para mostrar correctamente en la consola el tipo double(que devuelve iOpen() 5 decimales, en este caso), debe utilizar la función DoubleToStr()

string DoubleToStr( double value, int digits)
Convierte un valor numérico en una cadena de texto que contiene una representación de caracteres de un número en el formato de precisión especificado.

Parámetros:

value - Величина с плавающей точкой.

digits - Формат точности, число цифр после десятичной точки (0-8).

 
sllawa3:
Me interesa la inversión de la equidad de ascendente a descendente, siempre que la equidad sea mayor que el saldo... para cerrar todo lo abierto...

Y aquí hay un ejemplo de cómo funciona... Deliberadamente hice una apertura de posición en cada nueva barra... Así que, aquí tenemos a "OC Killer"... :)


Se adjunta el informe del probador, donde no hay limitadores y la apertura de posiciones en cada garrapata - gran porcentaje ... Y no hay reducción de la deuda :) Es una pena que nadie te deje trabajar así...

Aquí hay una imagen del informe:


He ganado mucho dinero con estas "incursiones", sin apenas detracciones. Incluso no he conseguido llegar a las adquisiciones (puedes verlas arriba):


Archivos adjuntos:
Razón de la queja: