[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 402

 
hoz:

Vadim, eu o faria do jeito que você descreveu! Foi por isso que lhe fiz uma pergunta. Eu pensei, talvez eu não tenha levado algo em conta. Eu ainda estou observando minha própria lógica e a lógica de outros programadores. Porque, além da lógica básica, vejo que preciso levar em conta uma série de fatores.

RefreshRates() atualiza o histórico em threads de especialistas. MarketInfo() retira dados do servidor. Não há necessidade de atualizá-lo. É um freio desnecessário.

Se for necessário atualizar, uma simples chamada de RefreshRates() não dará nada. Devemos, de alguma forma, controlar e lidar com o evento da chegada de toda a história.

 
Olá, como uso o metaeditor?
 
crespo1985:
olá, como usar o metaeditor?


Bem, olá! Use-a como quiser! Este não é o seu lugar para fazer perguntas como essa... Este é um fórum de programadores...

Zhunko:

RefreshRates() atualiza o histórico no thread do Expert Advisor. MarketInfo() retira dados do servidor. Não precisa ser atualizado. É uma frenagem desnecessária.

Se for necessário atualizar, uma simples chamada de RefreshRates() não pode fazer nada. Devemos controlar e lidar de alguma forma com todos os eventos históricos.

Sim. Eu entendo que RefreshRates() atualiza os dados de mercado (seu histórico para o tempo atual) e então a variável ambiente de mercado usa o último valor recebido. Tanto quanto eu entendo, esta é a única variante lógica. Portanto, esta função é escrita de forma mais fácil e rápida, mais lógica e prática, e mais confiável, não é?

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:

Sim. Entendo que RefreshRates() atualiza os dados de mercado (seu histórico para a época atual), e então a variável de ambiente de mercado usa o último valor recebido. Tanto quanto eu entendo, esta é a única variante lógica. Portanto, esta função seria escrita mais fácil e rápida e mais lógica, mais prática e confiável, certo?

Eu gostaria de ir assim:

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);
 }

Uma função separada deve ser escrita para atualizar o histórico.

 

2 horas tentando escrever uma peça de teste, para testar ainda mais diferentes condições.

Não funciona!

Por favor, me dê o erro.

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(); }
  

a questão é que as ordens são abertas após 2pp em sua própria direção.

abre venda e termina...

 

Boa tarde! Perdoe a trivialidade. As linhas são de um robô, eu tenho o robô há anos e basicamente um ciclo deste tipo vagueia invariavelmente de um para o outro.

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

Por que meu pedido é total menos um? É verdade que o loop está indo para uma diminuição na variável e?

 

A função de Kim tem um parâmetro de tempo ="Data e hora em segundos desde 1970".

Eu experimentei 2 variantes.

e ambos dão um lucro não para o dia atual, mas um lucro completo ao longo de toda a história....

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:

Bom dia! Perdoe a trivialidade. As linhas são de um robô, eu tenho o robô há anos e basicamente um ciclo deste tipo vagueia invariavelmente de um para o outro.

Por que meu pedido é total menos um? É verdade que o loop está indo para uma diminuição na variável e?

O laço conta um índice de 0 a Total-1 ou de Total-1 a 0. É por isso que precisa de um sinal de menos ou de um sinal menor < .
 
Zhunko:

Eu o faria:

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);
 }

Receber dados viaMarketInfo() mesmo para esta ferramenta de janela seria muito caro em termos de recursos, você não acha?

Zhunko:

Você deve escrever uma função separada para atualizar o histórico.


Eu não entendo bem a lógica de escrever uma função separada. A própria função RefreshRates() atualiza dados de variáveis pré-definidas. E Bid and Ask são variáveis pré-definidas. Se a função RefreshRates() atualiza variáveis pré-definidas, por que escrever alguma função adicional?
 
Obrigado!!!
Razão: