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 191

 
yan720:

Obrigado por sua resposta. Eu mesmo fiquei surpreso que tal pergunta tivesse surgido. Embora, talvez eu tenha entendido mal o que eu vi e o que causou a pergunta.

Estou agora analisando o código de outras pessoas para ver quais métodos (diferentes dos meus e talvez mais eficientes) são usados para implementar certos algoritmos. Neste momento estou olhando para o notório Ilan 1.6 Expert Advisor (em anexo). Posso ver que foi montado a partir de várias peças e depois reconstruído. Mas a linha 337 contém uma função de parada de trilha definida pelo usuário (embora a bandeira de seu uso seja retirada à força no início). Esta função é chamada na linha 52.

Minha pergunta surge porque a parada móvel mencionada acima modifica as ordens abertas (e pode haver várias delas) por uma parada perdida mantendo seu TakeProfit inicial, mas definindo o mesmo valor (AveragePrice, que é calculado nas linhas 173 e 178) para essas ordens como um preço aberto (segundo parâmetro da função OrderModify).

Ou esse parâmetro (preço aberto) é simplesmente ignorado pelo servidor ao modificar uma ordem aberta e o servidor pode definir qualquer preço?

Ao modificar uma posição de mercado, o preço deve ser definido e igual ao preço de abertura: OrderOpenPrise()

PS Se eu fosse você, não procuraria por "algoritmos eficientes" neste código - parece que a pessoa escreveu código sem realmente saber o que está fazendo lá...

 
Ir para
 Alert("Исполнение программы");
    double p[100];
    int i =0;
    int n = OrdersTotal ();
    int t =0;
    
    for (i=0; i<=n+1; i++)
    {
    
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
     
      p[i+1] = OrderProfit();      // р - це прибуток ордера
     
     } 
    }
    for (i=0; i<=n+1; i++)
    {
    if (p[i+1]>0)                  // якщо ордер прибутковий, то його 
    {
      Alert("Є прибуток ордер ",i+1);
      OrderSelect(i+1,SELECT_BY_POS,MODE_TRADES); 
      Alert("Маємо помилку ",GetLastError());
      Alert("Вибрали ордер ",i+1);
      double ld_Price;
      if (OrderType() == 0) ld_Price = NormalizeDouble (Bid, Digits);
      else ld_Price = NormalizeDouble (Ask, Digits);
      OrderClose (OrderTicket(), OrderLots(), ld_Price, 2);  // треба зачинити 
      Alert("Маємо помилку ",GetLastError());
      Alert("Закрили ордер ",i+1); 
       if ( OrderType()==OP_BUY)                              //  в залежності від того, якого типу ордер ми зачинили
       { 
        Alert("Ордер типу бай");
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);   // змінюється порядок відкривання наступних ордерів
        Alert("Відкрили ордер типу селл");
        Sleep(10000);
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        }else
      {
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        Sleep(10000);
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);    
        Alert("Відкрили ордер типу селл");
      }
    } 
   } 
    Alert("Последняя ошыбка ",GetLastError()); 
//----
   return(0);
  }

achar que a "estupidez" seja bondosa, ter piedade de um homem torturado por Pascal.

 
artmedia70:
Ao modificar uma posição de mercado, o preço deve ser definido e igual ao preço de abertura da posição: OrderOpenPrise()

Então esta função, na sua opinião, não funcionará? Eu não o testei, mas me parece fazer parte de um código de trabalho (este Ilan foi obviamente reconstruído a partir de algo depurado, na melhor das hipóteses). Ou ainda é um código mesquinho?

void TrailingAlls(int pType, int stop, double AvgPrice) {
   int profit;
   double stoptrade;
   double stopcal;
   if (stop != 0) {
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber) {
               if (OrderType() == OP_BUY) {
                  profit = NormalizeDouble((Bid - AvgPrice) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Bid - stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal > stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  profit = NormalizeDouble((AvgPrice - Ask) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Ask + stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal < stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(1000);
         }
      }
   }
}
 
Quando três barras consecutivas na mesma direção para abrir uma ordem de compra ou venda, parar a perda colocada em cima da barra anterior, depois de fechar a vela, é preciso parar a perda na barra de evitar a perda.
 
artmedia70:

PS Se eu fosse você, não procuraria por "algoritmos eficientes" nesse código - parece que o cara escreveu o código sem realmente saber o que ele está fazendo lá...

Sim, o código é muito específico com muita redundância e não apenas isso. Mas estou interessado não tanto em algoritmos como tal, mas na abordagem para implementar a idéia por trás deles. Estou olhando para o quadro geral, ou algo parecido. O que é colocado em funções individuais, como é implementado o mesmo braço móvel, ao contrário do meu próprio, etc. Eu sou autodidata e isso é útil para mim :)
 
artmedia70:
No lugar certo - que lugar é esse?


Por exemplo, um pedido já está em 1200 pontos... e o preço, por exemplo, estava afundando e as estrelas já estão alinhadas para que neste lugar um pedido tenha que ser colocado... e o pedido já está lá e não para baixar o saldo abaixo do exigido, não para colocar dois pedidos cada um, por exemplo
 
yan720:

Então você acha que esta função não vai funcionar? Eu não o testei, mas me parece fazer parte de um código de trabalho (este Ilan foi obviamente reconstruído a partir de algo depurado na melhor das hipóteses). Ou ainda é um código mesquinho?

Bem... o código não é para valer. Pelo menos.

 
A essência da pergunta é a seguinte. Quero mudar o Expert Advisor padrão MACD simples, mas sou um zero total na programação.
Quero mudar o EA para trabalhar com uma grade, paradas e um magik em vez de uma única ordem.
Aqui estão as variáveis que eu gostaria de acrescentar:
Stoploss = é colocado no mesmo nível para toda a grade, por exemplo, é igual a EUR/USD = 200pp e é colocado no nível de 1,3450 para todos os pedidos na grade
MaxOnDer = Número máximo de ordens na grade, por exemplo, se=3, então o número máximo de ordens na grade será de 3
Distância = Distância entre duas ordens pendentes

Lommultiplicator = A relação do tamanho do lote da próxima ordem na grade.

Magic= número mágico

Saímos do comércio como no código inicial, ou seja, todas as ordens na grade serão fechadas quando a 1ª ordem for fechada.

Isso é tudo.
Se alguém otvezvayut ficaria muito grato!
Eu ficaria muito grato! Talvez alguém tenha um Expert Advisor pronto, que já está implementado na vida, também o fará.
 
sannin:

já existe, por exemplo, um pedido em 1200 pontos... e o preço desceu, por exemplo, e as estrelas estão alinhadas para que nesse lugar o pedido seja feito... e o pedido já está lá e não para baixar o saldo abaixo do necessário para evitar fazer 2 pedidos em 1 ponto cada, digamos

É mais ou menos assim:

//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy, int op, int mn, double pp) {
   int i, k=OrdersTotal()-1;
   for (i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()!=op)          continue;
         if (MathAbs(OrderOpenPrice()-pp)<0.5*Point) return(true);
         }
      else Print("FUNC ExistOrdersByPrice() : ошибка выбора ордера "+GetLastError());
      }
   return(false);
}
//+----------------------------------------------------------------------------+

Para verificar se há um pedido BuyStop no símbolo atual ao preço de 1,35000 com Magic, chamamos a função:

//+----------------------------------------------------------------------------+
   if (!ExistOrdersByPrice(Symbol(), OP_BUYSTOP, Magic, 1.35000)) {
      // тут код, если нет такого ордера
      }
   else {
      // тут код, если есть такой ордер
      }
//+----------------------------------------------------------------------------+
 
atztek:

Se você estiver falando de documentação, destaque a palavra no MetEditor e pressione F1. Ou você pode ir on-line, por exemplo:
https://docs.mql4.com/ru/customind/SetLevelStyle

Claro que obrigado, mas se você é preguiçoso demais para ler a pergunta, então qual é o objetivo de responder? Posso mudar o valor, espessura, cor e estilo dos níveis no indicador nas duas funções que tenho. Eu não tenho acesso à descrição. Estou perguntando novamente, alguém sabe a resposta? Eu não sei se já vi isso antes.

Anexei uma foto para mostrar o que eu preciso.

Razão: