[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 66

 
Fox_RM:
Boa tarde!
Encontrei um problema ao abrir um certo número (definido pelo usuário) de pedidos.
Eu escrevi um pequeno código para resolver este problema.
Mas há momentos em que um número arbitrário de ordens é aberto, geralmente perto do final do teste.

Abaixo está o próprio código.

Se você tem uma solução mais simples, eu ficaria feliz em receber comentários.


Isto provavelmente é melhor.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
Obrigado, mas é um pouco complicado para mim, e sua função emite 4 mensagens de uma só vez, enquanto eu preciso de uma. Acontece que não mais do que 64 caracteres em uma linha?

Não. Você pega sua longa mensagem e a divide em tantas partes quanto você pode ler na tela, mas não mais do que quatro. O principal é que cada parte não deve exceder 64 caracteres. Se sua mensagem for curta, você pode passá-la para uma função em uma parte.

Olhe, eu coloquei um tipster no trailer para testar esta função. Execute-o no testador em modo visual e coloque o indicador Win_Inform no gráfico de visualização (está na minha mensagem anterior no trailer). Você verá imediatamente como esta função funciona.

Arquivos anexados:
 
r772ra:


Isso provavelmente é melhor.

Trata-se do código que usei para começar a atualizar o meu. Há 3 problemas em sua versão:

- assim que as ordens OP_BUY e OP_SELL forem abertas, os parâmetros OrdB e OrdS aumentarão automaticamente a cada tick, então acrescentei a condição de recálculo somente na mudança do tick correspondente (venda ou compra);

- o recálculo de todas as ordens leva ao erro OrdB e Ord, precisamos apenas da última mudança nas ordens a ser considerada;

- em sua versão não há diminuição dos parâmetros OrdB e Ord para maior abertura de pedidos if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Parece ser esse o caso.

 
Fox_RM:

Trata-se do código que usei para começar a atualizar o meu. Há 3 problemas em sua versão:

- assim que as ordens OP_BUY e OP_SELL forem abertas, os parâmetros OrdB e OrdS aumentarão automaticamente a cada tick, então acrescentei a condição de recálculo somente na mudança do tick correspondente (venda ou compra);

- o recálculo de todas as ordens leva ao erro OrdB e Ord, precisamos apenas da última mudança nas ordens a ser considerada;

- em sua versão não há diminuição dos parâmetros OrdB e Ord para maior abertura de pedidos if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Parece ser a mesma coisa.

Certo, precisamos zerar os contadores de pedidos antes do laço de

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

Boa tarde! Por favor, ajude-me a entender a função de Kim:

 
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
 if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

Eu não entendo a linha

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

Por que não há sinais após o primeiro se, o que acontece quando uma expressão é escrita desta forma. O que o StringFind faz, e por que o fio é procurado pelo JPY? Como pode d = 0, e em que caso 2 é atribuído e em que 4? Serei muito grato pela resposta, obrigado de antemão))))

 
r772ra:

Isso mesmo, antes do loop, precisamos zerar os contadores de pedidos

)) Por alguma razão, eu mesmo não pensei nisso e comecei a fumegar.
 
Fox_RM:
)) Por alguma razão eu mesmo não pensei nisso, comecei a ficar sem fôlego.

Boa viagem.
 
Lisi4ka330: porque não há sinais depois do primeiro se, o que acontece se a expressão for escrita assim... Como pode d = 0, e em que caso 2 é atribuído e em que 4? Eu ficaria muito grato por uma resposta, obrigado de antemão))))

Acho que isto faz mais sentido

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - exatidão das cotações (dígitos após o ponto decimal)

se houver um par JPY, então a taxa para as majors é xxx.xx

se não houver JPY no par, então a taxa para as majors será x.xxxx (daí o nome"quatro dígitos")

 
r772ra:

Sim, antes do loop, precisamos zerar os contadores de pedidos.


Perdi outro ponto:

- em sua versão, não há diminuição dos parâmetros OrdB e OrdS para maior abertura de pedidosif (OrdB<=OrederBuy),if (OrdS<=OrederSell).

Na nova versão, por exemplo, abrimos 5 pedidos, recalculamos os mesmos, mas a condição não nos permite abrir mais pedidos. Na minha antiga variante, OrdB-- e OrdS--

foram utilizados.

 
GaryKa:

Acho que isto faz mais sentido

d - exatidão das cotações (dígitos após o ponto decimal)

se houver um par JPY, então a taxa para as majors é xxx.xx

se não há JPY no par, então as taxas para as majors são aproximadamente x,xxxx (daí o nome "quatro dígitos")

GaryKa, obrigado pela resposta, é um pouco obscuro como d pode ser 0, porque a função
 d=MarketInfo(sy, MODE_DIGITS)
retorna o número de casas decimais, portanto d será sempre maior que 0 e a condição será sempre falsa
Razão: