[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 628

 
hoz:


Há isso. Aqui está a correção.

E a função de modificação está aqui:

Estranho Mas não há paradas e assume a saída novamente.



OrderSelect(g_ticket,SELECT_BY_TICKET) antes da linha if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
 
TUNGUS:


History, History_Draw - eles trabalham como Expert Advisors durante os testes.

Você precisa de algo assim para assistir a correções na história através de determinados parâmetros


Na história ou na tabela? Se sim, então que tipo de dados você quer ver na janela do gráfico, em uma janela separada, impressa como uma tabela, na forma de velas de cores diferentes, ou como uma linha conectando o início e o fim do movimento?
 
rigonich:

OrderSelect(g_ticket,SELECT_BY_TICKET) antes da linha if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)


Foi o que eu fiz:

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

Não há paradas e tomadas de controle. O registro diz erro 130, dizendo que as paradas estão erradas. Não vejo a razão.

 
hoz:


Foi o que eu fiz:

Não há paradas e tomadas de controle. O registro diz erro 130, dizendo que as paradas estão erradas. Não vejo a razão.


Sem ifs, apenasOrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);, e você pode deixá-lo em OrderModifying()

//+------------------------------------------------------------------+

Ordens nulasModificar()

{

OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);

if(g_type == OP_BUY)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Se o parâmetro de entrada de stop loss não for 0

// Obtenha o valor de Stop Loss para a ordem selecionada

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Se o parâmetro de entrada TakeProfit não for igual a 0, então...

// obter o valor TakeProfit para a ordem selecionada

}

if(g_type == OP_SELL)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Se o parâmetro de entrada do stop loss não for 0

// Obtenha o valor de Stop Loss para a ordem selecionada

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Se o parâmetro de entrada TakeProfit não for igual a 0, então...

// obter o valor TakeProfit para a ordem selecionada

}

if(sl != 0 ||| tp != 0) // Se os valores obtidos de sl e tp não forem iguais a 0, então..

{

OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Modificar pedido

}

}


 
anton.veksler:

Problema com Symbol() MT4:

2 funções a ilustrar:

A execução da primeira produz um fio vazio:

Mas a segunda função produz uma string ID "EURUSD" (bem, depende do gráfico, mas produz, embora de acordo com a lógica da função deva ser uma string vazia):

Ajudar-me a entender o que está errado? Obrigado


Você não pode usar nomes reservados(valor) ao declarar suas variáveis, ligue para _valor
 
hoz:


Foi o que eu fiz:

Não há paradas e tomadas de controle. O registro diz erro 130, dizendo que as paradas estão erradas. Não vejo a razão.

E eles não o farão!

  double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

Vitaly, eu fiz como você disse, mas nada mudou. Aparentemente, o bicho está enterrado em outro lugar.

Antes eu tinha tudo (abertura de pedidos - modificação e transferência para a b.w. quando o nível de preço estabelecido é atingido) e tudo funcionava. Foi assim:

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

Agora, como eu decompus tudo em funções especializadas específicas, tudo deixou de funcionar demais. Já tentei nos dois sentidos, nada funciona. as paradas não estão definidas.

 
borilunad:

E eles não o farão!

 double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

Onde está a lógica nisso? Eu gostaria de entender... Aqui está a função:

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

Se as variáveis de entrada i_sl e i_tp não forem iguais a zero, obtemos a parada e tomamos preços que já estarão na ordem - sl etp. Depois disso, vou verificar se calculamossl etp aqui (se para calções):

 if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }

Se os valores forem obtidos, então eles não podem ser zero... porque serão alterados! Estas são variáveis que obtemos seqüencialmente por contexto de código.

E aqui, eu verifiquei se encontramos os valores de parar e tomar. Como eles podem ser zero depois de todas as condições?

if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
 

Primeiro construa sua lógica no início, depois faça funções, arquivos, etc.

Por que coçar a mão esquerda atrás da orelha direita?

 

Minha função começa com uma declaração de parâmetros, ver Kim's!

void ModifyOrder(int ticket, double pp, double sl, double tp, datetime e, color arrow_cl)