[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 402

 
hoz:

Vadim, ¡yo lo haría como lo has descrito! Por eso te he hecho una pregunta. Pensé que quizá no había tenido en cuenta algo. Sigo observando mi propia lógica y la de otros programadores. Porque además de la lógica básica, veo que tengo que tener en cuenta una serie de factores.

RefreshRates() actualiza el historial en el hilo experto. MarketInfo() toma los datos del servidor. No es necesario refrescarlo. Es un freno innecesario.

Si se debe actualizar, una simple llamada a RefreshRates() no dará nada. Debemos controlar y manejar de alguna manera el evento de la llegada de toda la historia.

 
Hola, ¿cómo puedo utilizar el metaeditor?
 
crespo1985:
hola ¿cómo se usa el metaeditor?


Bueno, ¡hola! Utilízalo como quieras. Este no es el lugar para hacer esas preguntas... Este es un foro de programadores...

Zhunko:

RefreshRates() actualiza el historial en el hilo del Asesor Experto. MarketInfo() toma los datos del servidor. No es necesario actualizarlo. Es un frenazo innecesario.

Si se debe actualizar, una simple llamada a RefreshRates() no puede hacer nada. Debemos controlar y manejar todo el evento de la historia de alguna manera.

Sí. Entiendo que RefreshRates() refresca los datos del mercado (su historial hasta el momento actual) y luego la variable de entorno del mercado utiliza el último valor obtenido. Por lo que tengo entendido, ésta es la única variante lógica. Por lo tanto, esta función se escribe de forma más fácil y rápida y, lógicamente, más práctica y fiable, ¿no es así?

double fGet_TradePrice(int fi_price,    // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }
}
 
hoz:

Sí. Entiendo que RefreshRates() actualiza los datos del mercado (su historial hasta el momento actual), y luego la variable de entorno del mercado utiliza el último valor recibido. Por lo que tengo entendido, ésta es la única variante lógica. Por lo tanto, esta función se escribiría de forma más fácil y rápida y más lógica, más práctica y fiable, ¿verdad?

Yo iría así:

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

Se debe escribir una función separada para actualizar el historial.

 

2 horas tratando de escribir una pieza de prueba, para seguir probando diferentes condiciones.

No funciona.

Por favor, dame el error.

int mm;


if (mm==0) { B=Bid; mm=1;} 

OrderSelect(0,SELECT_BY_POS,MODE_TRADES); 

if ( (Bid> B+0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_SELL) ) { My_close(); My_buy (); My_modify(); }  

if ( (Bid< B-0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_BUY ) ) {My_close(); My_sell (); My_modify(); }
  

la cuestión es que las órdenes se abren después de 2pp en su propia dirección.

abre la venta y termina...

 

¡Buenos días! Perdonen la trivialidad. Las líneas son de un robot, lo tengo desde hace años y básicamente un ciclo de este tipo pasa invariablemente de uno a otro.

 for(int i=OrdersTotal()-1;i>=0;i--) 
      {  if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)

¿Por qué el total de mi pedido es menos uno? ¿Es cierto que el bucle va a la disminución de la variable y?

 

La función de Kim tiene el parámetro tiempo ="Fecha y hora en segundos desde 1970"

He probado 2 variantes.

y ambos dan un beneficio no para el día actual, sino un beneficio completo sobre toda la historia....

int t=(     TimeCurrent()-( (Hour()*3600) +(Minute()*60)+Seconds()   ) ); 
int t=(    (Hour()*3600) +(Minute()*60)+Seconds()    ); 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}
 
Dimka-novitsek:

¡Buenas tardes! Perdonen la trivialidad. Las líneas son de un robot, lo tengo desde hace años y básicamente un ciclo de este tipo pasa invariablemente de uno a otro.

¿Por qué el total de mi pedido es menos uno? ¿Es cierto que el bucle va a la disminución de la variable y?

El bucle cuenta un índice de 0 a Total-1 o de Total-1 a 0. Por eso necesita un signo menos o un signo menos < .
 
Zhunko:

Lo haría:

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

Recibir datos a través deMarketInfo() incluso para esta herramienta de ventana sería demasiado caro en términos de recursos, ¿no crees?

Zhunko:

Deberías escribir una función separada para actualizar el historial.


No entiendo muy bien la lógica de escribir una función separada. La propia función RefreshRates( ) actualiza los datos de las variables predefinidas. Y Bid y Ask son variables predefinidas. Si la función RefreshRates() actualiza las variables predefinidas, ¿por qué escribir alguna función adicional?
 
¡¡¡Gracias!!!