[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 935

 

Olá, estou interessado nesta pergunta. A alpari fornece um servidor onde você pode carregar seu conselheiro para que ele possa trabalhar 24 horas por dia? Você teria a gentileza de responder pessoalmente?

 
gheka:

Não está funcionando, talvez eu precise mudar algo aqui ou colocá-lo após o início.

Eu tentei traduzir seu código em papel para o russo, eu entendo, mas não funciona,

é muito complicado, especialmente quando as condições em cada condição se seguem, e uma condição em oito condições.

É claro que não discuto quem criou este código é um milagre, mas para mim é uma completa perversão (de uma boa maneira)

Não sou preguiçoso para acrescentar comentários a cada operação e condição, exceto para a função padrão.


Há alguma redundância no código, mas o código é bastante legível

 
pergunta sobre mudança de período no programa ... por exemplo, há uma certa seqüência de operadores que precisa ser aplicada a diferentes períodos ... como eu entendo que é mais fácil fazer isso na forma de um ciclo ... mudando o período... encontro uma função na documentação que retorna o valor do período ... mas não consigo encontrar uma função para mudá-lo ... o que estou fazendo de errado ?
 

Algo não está funcionando para você, não este código... :)

bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {// Объявление функции. Передаваемые параметры: sy = символ, op - тип, mn - магик
  datetime t;                                                  // Переменная содержит время закрытия ордера
  double   ocp, osl;                                           // ocp - цена закрытия позиции, osl - цена СтопЛосс закрытой позиции
  int      dg, i, j=-1, k=OrdersHistoryTotal();                // k содержит общее количество ордеров в истории

  if (sy=="0") sy=Symbol();                                 // Если в ф-цию передан sy равный 0 или NULL, то использовать символ графика
  for (i=0; i<k; i++) {                                     // Цикл по массиву закрытых ордеров
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {      // Если выбран ордер из массива закрытых ордеров, ...
      if (OrderSymbol()==sy || sy=="") {                    // ... если его символ совпадает с нашим, ...
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {  // ... если его тип Бай или Селл, ...
          if (op<0 || OrderType()==op) {                // ... если тип ордера равен или -1 (имеется ввиду любой) или равен переданному в ф-цию, ...
            if (mn<0 || OrderMagicNumber()==mn) {       // ... если его магик или любой (-1) или равен переданному в ф-цию (магику советника), ...
              if (t<OrderCloseTime()) {    // ... если переменная t содержит время закрытия меньше, чем время закрытия выбранного ордера, то ...
                t=OrderCloseTime();        // ... то присвоим переменной t время закрытия выбранного ордера (этот ордер закрыт позже предыдущего)
                j=i;                                        // Запишем в переменную j индекс найденного ордера с максимальным временем закрытия
              }
            }
          }
        }
      }
    }
  }                                                       // По окончании цикла в переменной j находится индекс последнего закрытого ордера
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {      // Выберем его по индексу
    dg=MarketInfo(sy, MODE_DIGITS);                       // Количество цифр после десятичного точки в цене инструмента, заданного переменной sy
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2; // Честно... точно не скажу, но вижу, что корректировка под йену
    ocp=NormalizeDouble(OrderClosePrice(), dg);           // Нормализуем цену закрытия ордера для дальнейшего сравнения с ценой СтопЛосс
    osl=NormalizeDouble(OrderStopLoss(), dg);             // Нормализуем цену СтопЛосс ордера для сравнения с ценой закрытия
    if (ocp==osl) return(True);                           // Если эти цены равны, значит поза закрыта по стопу, возвращаем значение "Истина"
  }
  return(False);                                          // Возвращаем "Ложь"
}

Essa é toda a lógica... Viktor estava certo - é redundante, mas o mais simples possível... :)

 
Skopcheny:
pergunta sobre a mudança do período no programa ... por exemplo, há uma certa seqüência de operadores que deve ser aplicada a diferentes períodos ... como eu entendo que é mais fácil fazê-lo na forma de uma linha do tempo ... mudando o período... Eu encontro uma função na documentação que retorna um valor de período... mas não consigo encontrar uma função para mudá-la... o que estou errado ?

O período do gráfico pode ser qualquer um dos seguintes valores:

Constante Valor Descrição
PERÍODO_M1 1 1 minuto
PERÍODO_M5 5 5 minutos
PERÍODO_M15 15 15 minutos
PERÍODO_M30 30 30 minutos
PERÍODO_H1 60 1 hora
PERÍODO_H4 240 4 horas
PERÍODO_D1 1440 1 dia
PERÍODO_W1 10080 1 semana
PERÍODO_MN1 43200 1 mês
0 (zero) 0 Período do gráfico atual
 
Muito obrigado, só preciso de alguns esclarecimentos ... para um grupo de operadores trabalhar em um determinado período é suficiente especificar um dos períodos à sua frente, como são apresentados nesta tabela?
 
Skopcheny:
Muito obrigado, só preciso de alguns esclarecimentos ... para um grupo de operadores trabalhar em um determinado período é suficiente especificar um dos períodos à sua frente, como são apresentados nesta tabela?
Para responder corretamente à sua pergunta, você precisa ver pelo menos um exemplo de código onde você precisa especificar o período...
 
artmedia70:
Para dar a resposta certa à sua pergunta, você precisa ver pelo menos um código de amostra onde você especificamente precisa definir o período...


string trend()
{int count,count_change;
double bar_centr;
string trend;
bool clear;
for (int i=10;i!=0;i--)
{
bar_centr = (Alto[i]-Baixo[i])/2+Baixo[i]);
if (bar_centr>((Alto[i+1]-Baixo[i+1])/2+Baixo[i+1])
count+++;

if (bar_centr<((Alto[i+1]-Baixo[i+1])/2+Baixo[i+1])
count--;
}

Print (count, "period ")Period());


if (count>3) trend="buy";
if (count<-3) trend="sell";
if (count<3||count>-3) trend="uncertain";





return(trend);}

esta função precisa ser aplicada uma após a outra em períodos diferentes ... Funciona se eu o conecto a janelas no terminal com prazos diferentes ... A questão é se é possível para a EA lidar com vários períodos diferentes ...

 
Skopcheny:


esta função deve ser aplicada sucessivamente a diferentes períodos ... Funciona se eu ligar o EA a janelas no terminal com períodos diferentes ... A questão é se é possível para a EA lidar com vários períodos diferentes ...

Entendo que você quer que sua função trabalhe não apenas com o gráfico e o período atuais, mas com qualquer um dos períodos, passados a ele ...

string trend(string sy="", int tf=0)
{
   int count,count_change;
   double bar_centr;
   string trend;
   bool clear;

   if (sy=="" || sy=="0") sy=Symbol();      
   if (tf==0) tf=Period();
   
   for (int i=10; i>0; i--)
      {
         bar_centr = (iHigh(sy,tf,i)-iLow(sy,tf,i))/2+iLow(sy,tf,i);
         if (bar_centr>((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tf,i+1)))
            count++;
         if (bar_centr<((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tfi+1)))
            count--;
      }

   Print (count,"период ",tf);

   if (count>3) trend="покупка";
   if (count<-3) trend="продажа";
   if (count<3||count>-3) trend="неопределенность";

   return(trend);
}

Agora, chame sua função desta maneira

tendência(Símbolo(), Período()); // Ele retornará valores para o gráfico e período em que a EA está pairando...

tendência(USDJPY, PERÍODO_D1); // Retorna valores para o símbolo USDJPY e período de "1 dia".

Em vez de PERÍODO_D1 você pode entrar 1440 - dará o mesmo resultado...

Se for chamada sem parâmetros, a função retorna valores para o símbolo e período atual (eles são definidos por padrão)

 
artmedia70:

Entendo que você quer que a função funcione não só com o gráfico atual e o período, mas também com qualquer gráfico passado a ele...

Agora chame sua função desta maneira:

tendência(Símbolo(), Período()); // Ele retornará valores para o gráfico e período em que a EA está pairando...

tendência(USDJPY, PERÍODO_D1); // Retorna valores para o símbolo USDJPY e período de "1 dia".

Em vez de PERÍODO_D1 você pode entrar em 1440 - é a mesma coisa...




resposta abrangente... muito obrigado ...