Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 96

 
Vinin:

Você tem certeza de que tem todos os aparelhos. Eles estão faltando em alguns lugares. É por isso que sua lógica é falsa. E muito provavelmente o resultado não é o que você esperava.
Vitya, você já esteve fora? Não te vejo há muito tempo...
 
artmedia70:
Vitya, você já esteve fora? Já não o vejo há muito tempo...


Eu estava em casa hoje (quase).
 
Vinin:

Estive em casa hoje (quase)
Estou quase em casa para a segunda semana :))
 
Vinin:

Você tem certeza de que tem todos os aparelhos. Eles estão faltando em alguns lugares. É por isso que sua lógica é falsa. E muito provavelmente, o resultado não é o que se espera.

Se você se refere ao código do indicador, tudo está bem aí, o indicador funciona, dá sinais na forma de setas (para buffers de indicador de compra/venda 4 e 5). Mas quando leio estas setas do indicador no Expert Advisor, fico com um disparate. Não mencionei completamente o Expert Advisor porque o principal é entender como ler o sinal e fazer a operação correspondente. Em geral, o problema está na leitura do sinal.
 
paladin80:

Para colar o código corretamente aqui, primeiro clique em SRC e depois copie o código ali.

Se entendi corretamente, em um determinado momento temos que abrir um OP_BUYSTOP e um OP_SELLSTOP ? É aceitável ter qualquer outra ordem pendente neste momento? Por exemplo, há ordens pendentes, mas antes de abrir uma nova, as antigas devem ser apagadas?



if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5

if ((volum<=n)==true)// если объем свечей меньше или равно n пунктов 
{ 
OrderSend ( Symbol (), OP_BUYSTOP, параметры);// открываем отложенный ордер байстоп
OrderSend ( Symbol (), OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)&& OrderTakeProfit()==true) ///если первый открывшийся отложенный ордер закрыт с профитом
{
OrderDelete(1);// удаляем второй открытый отложенный ордер
}

}
bool closeorder;//определим  закрытие ордеров
closeorder=true;

if (closeorder==true)//
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время 
{
for(int i=OrdersTotal()-1; i>=0; i--)// определяем количество открытых позиций, и отложенных ордеров и закрываем все возможные позиции, и отложенные ордера
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
{
for(int D=OrdersTotal()-1; D>=0; D--)
if (OrderSelect(D,SELECT_BY_TICKET,MODE_TRADES)==true)
if (OrderType()==OP_BUYSTOP ) OrderDelete(D); //удаляем отложенный байстоп
if (OrderType()==OP_SELLSTOP) OrderDelete(D);// удаляем отложенный селлстоп

Já colei o código genérico para torná-lo mais claro... No final do dia eu queria fechar todas as posições e ordens possíveis...

e na hora de abrir duas ordens pendentes (pela manhã) não há ordens abertas ou posições abertas antes disso, já que todas elas têm que ser fechadas a uma certa hora da noite. Será que o fechamento completo do meu pedido está pelo menos corretamente descrito? =)))



 
artmedia70:

Sinceramente, não conheço a lógica de sua função. Se deve apagar objetos ou construí-los, não sei. Diga-me o que você quer que ele faça e veremos onde a lógica está errada. Entretanto, se a função tentar construir um objeto gráfico, mas falhar, significa que ele já existe. Então, o que segue de acordo com a lógica de seu programa? Você pode construir um novo objeto com um nome diferente (por exemplo, adicionar a hora atual ao nome do objeto (TimeToStr(TimeCurrent()))) ou, se você já tem um objeto mas precisa alterar suas propriedades, não construa-o novamente, mas simplesmente mude suas propriedades. Então, o erro não ocorrerá novamente.

É simples. O principal é saber o que você quer... :)



Na verdade, a função é apenas um substituto visual para a impressão, ela apenas exibe tudo na tela. Ainda não está muito bem escrito, mas funciona. :) Vou chegar lá e reescrevê-lo. E então você pode pensar sobre a questão que foi.

A propósito, se você não construir novos objetos, mas modificar as propriedades de objetos existentes, então novamente... Vai ser uma dor de cabeça. A idéia é exibir os últimos cardumes N na tela. Se sempre sobrescrevermos o último objeto, podemos acabar com apenas um objeto que tenha um bug em particular. Eu poderia ir mais longe e selecionar em um loop quantos objetos eu precisar e reescrevê-los apenas, mas provavelmente não vale a pena o esforço, já que esta função é apenas para testes e eu não estou realmente entediado com ela, já que já tenho muitas coisas para fazer. Um dia eu tentarei o código dessa função, e o trarei à razão, e então poderei pensar sobre isso!

 

Surgiu uma pergunta. Estou escrevendo a seguinte experiência. Tenho um monte de pedidos que, naturalmente, abrem um após o outro com base em certos sinais. Se a última ordem for fechada, todas as outras ordens de mercado e pendentes devem ser fechadas de todo.

Claro, tudo pode ser escrito através de matrizes, mas eu usei uma maneira comum. Aqui vamos nós:

for (int li_ord=OrdersTotal()-1; li_ord>=0; li_ord--)
   {
      if (!OrderSelect(li_ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();

      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Condição:

 if (GetLastOrderState() != 0)

verificamos se a última ordem aberta está fechada! Depois começamos a apagar as ordens pendentes e a fechar as ordens de mercado.


Aqui está a função em si, portanto não há dúvida de que algo está errado com ela (Críticas e comentários são bem-vindos, e até mais do que bem-vindos :)) ):

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
double GetLastOrderState()
{
   double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
          lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   
   return (lastOrderCloseTime);
}
 
vovak_85:

Se você estiver falando do código indicador - tudo está bem aí com os parênteses, o indicador funciona, dá sinais na forma de setas (para compra/venda - 4 e 5 buffers indicadores). Mas quando leio estas setas do indicador no Expert Advisor, fico com um disparate. Não mencionei completamente o Expert Advisor porque o principal é entender como ler o sinal e fazer a operação correspondente. Em geral, o problema está na leitura do sinal.
Este é o seu:
double L_B=iCustom(0,0,"Makedonskii",MM,MP,0,4);

double L_S=iCustom(0,0,"Makedonskii",MM,MP,0,5);

É assim que deve ser:
double L_B=iCustom(NULL,0,"Makedonskii",MM,MP,4,0);

double L_S=iCustom(NULL,0,"Makedonskii",MM,MP,5,0);
Algo parecido com isto.
 
hoz:

Na verdade, a função é apenas um substituto visual para a impressão, mas exibe tudo na tela. Ainda não está muito bem escrito, mas funciona... :) Vou chegar lá e reescrevê-lo. E então você pode pensar sobre a questão que foi.

A propósito, se não construirmos novos objetos, mas mudarmos as propriedades dos existentes, então novamente... Isso seria uma dor de cabeça. Por idéia, precisamos exibir os últimos N-joints na tela. Se sempre sobrescrevermos o último objeto, podemos acabar com apenas um objeto que tenha um bug em particular. Eu poderia ir mais longe e selecionar em um loop quantos objetos eu precisar e reescrevê-los apenas, mas provavelmente não vale a pena o esforço, já que esta função é apenas para testes e eu não estou realmente entediado com ela, já que já tenho muitas coisas para fazer. Um dia eu tentarei o código dessa função, e o trarei à razão, e então poderei pensar sobre isso!

Uma vez eu fiz uma função que exibe mensagens em uma janela indicadora vazia. Você pode ajustar as cores das linhas apresentadas. Já está depurado. Se você precisar, eu posso compartilhá-lo.
 
r772ra:
Isto é seu: deveria ser assim:
Algo parecido com isto.

obrigado pela correção, mas o algoritmo não funcionou corretamente.
Razão: