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

 

Muito bem. Não vamos fazer isso. Parece que ambos não temos conhecimento suficiente. O autor da pergunta perguntou como mudar o StopLoss. Acho que ele não vai entrar nas profundezas.

Tente atribuí-lo após a função OrderSend

 
MaxZ:

Qual é o número "12" na função OrderSend? :(

E você me entendeu mal sobre a seleção dos pedidos... É assim que deve ser:

Hi!

Muito obrigado!!! por suas respostas!!!

Não devo tê-lo expressado corretamente: a idéia é esta:

Uma venda é feita a 1.4545... o preço vai contra a tendência - 1.4585... e ENTÃO - uma ordem pendente deve ser colocada a 1.4565.

meu código não está funcionando corretamente:

void otlogka (int order)
{  
   int a, k=OrdersTotal();
   for (a=k-1; a>=0; a--){
         if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES)){
            if (OrderType()==OP_BUY){
               if (Bid*Point-OrderOpenPrice()>40)
               RefreshRates();
               if (k>1){
                  {
                     order=OrderSend(Symbol(),OP_SELLLIMIT,0.02,OrderOpenPrice()+20*Point,1,SL,0,"Otlogka",mn,5,0);
                  }}}}}
    
           if (OrderType()==OP_SELL){
               if (Ask*Point-OrderOpenPrice()<40)
                  RefreshRates();
                  if (k>1){
                {
                  order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);
                }}}

}

Por favor, ajudem!!!

 
FOReignEXchange:

Eu lhe disse que enquanto a função OrderSend estiver funcionando, o preço pode mudar. Portanto, é preciso atribuí-lo depois, quando já tiver mudado.

Você pode fazer isso dessa maneira:

if (Opn_B)
{
   Alert("Попытка открыть ордер Buy...");
   RefreshRates();
   Ticket = OrderSend(Symb, OP_BUY , Lots, Ask, Slippage, 0, 0, NULL, MAGIC, 0, Blue);
   if (Ticket > 0)
   {
      if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
      if (OrderCloseTime() == 0)
      {
         Alert("Открыт ордер Buy ", Ticket, ".");
         Opn_B = False;
         SL = OrderOpenPrice()-StopLoss*Point;
         TP = OrderOpenPrice()+TakeProfit*Point;
         
         Alert("Попытка модифицировать ордер Buy ", Ticket, "...");
         if (OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0, Blue))
            Alert("Ордер Buy ", Ticket, " модифицирован.");
         else
            Alert("Ошибка: ", GetLastError());
      }
      else
         Alert("Да ну нафиг!?");
   }
   else
      Alert("Ошибка: ", GetLastError());
}
Há prós e contras em cada abordagem.
 
smartemiy:

Hi!

Muito obrigado!!! pelas respostas!!!

Devo tê-lo pronunciado mal: a idéia é esta:

Há uma venda a 1.4545... o preço vai contra a tendência - 1.4585... e ENTÃO - uma ordem pendente deve ser colocada a 1.4565.

meu código não está funcionando corretamente:

Por favor, ajudem!!!

O Bid and Ask não deve ser multiplicado por Point. Isso chamou minha atenção imediatamente.

As condições devem ser construídas de forma diferente:

if (Bid-OrderOpenPrice() > 40*Point)
{...}
if (OrderOpenPrice()-Ask > 40*Point)
{...}

Também não estou claro que variável você tem SL? Que valor ele tem? Onde é calculado?

E isto

           if (OrderType()==OP_SELL){
               if (Ask*Point-OrderOpenPrice()<40)
                  RefreshRates();
                  if (k>1){
                {
                  order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);
                }}}

Você deve colocá-lo em um loop. Um loop com busca de pedidos deve ser comum para pedidos de COMPRA e VENDA.

Você deve ser muito ruim na programação. Aconselho que você releia novamente o livro didático e veja exemplos, que são dados nele para escrever um simples Expert Advisor, calcular ordens e funções de negociação.


Também seu erro: RefreshRates() deve ser colocado antes de você querer usar variáveis pré-definidas ou matrizes de série temporal, não depois...

 
MaxZ:

Bid and Ask não precisam ser multiplicados por Point. Chamou-me imediatamente a atenção...

As condições devem ser construídas de forma diferente:


Você não tem que colocar parênteses?

if ((Bid-OrderOpenPrice()) > 40*Point)
{...}
if ((Ask-OrderOpenPrice()) < 40*Point)
 
MaxZ:

Bid and Ask não precisam ser multiplicados por Point. Chamou-me imediatamente a atenção...

As condições devem ser construídas de forma diferente:

Também não tenho certeza de qual variável você tem SL? Que valor ele tem? Onde é calculado?

E isto

Você tem que colocá-lo em um loop...

Você é muito mau em programação... Aconselho que você releia novamente o tutorial e veja exemplos de como escrever um simples Expert Advisor, calcular ordens e funções de negociação.

Este é o Stop Loss normal = SL
 
FOReignEXchange:


Você não tem que usar parênteses?

Não necessariamente. Funcionará sem os parênteses! :)

Depende de como você gosta. Caligrafia! :D

 
smartemiy:
Este é um Stop Loss regular = SL.
Como é calculado? E por que é comum para comprar e vender?

smartemiy:

há uma venda a 1.4545... o preço vai contra a tendência - 1.4585... e ENTÃO - uma ordem pendente deve ser colocada a 1.4565.

A propósito, se for contra a tendência, as condições devem ser negativas:

if (Bid-OrderOpenPrice() < -40*Point)
{...}
if (OrderOpenPrice()-Ask < -40*Point)
{...}

Normalmente a partir das expressões

 ProfitBUY  = Bid-OrderOpenPrice();
ProfitSELL = OrderOpenPrice()-Ask;

Podemos encontrar o lucro do comércio correspondente em pips. Se o lucro é negativo, já é uma perda. Aqui nós verificamos se a perda é superior a 40 pips, precisamos fazer um pedido pendente.

 
MaxZ:
Como é calculado? E por que é comum para comprar e vender?

Parar a perda não é tão importante, agora...

o código, em teoria, vai funcionar?? com seus ajustes

 
smartemiy:

Parar a perda não é tão importante, agora...

O código, em teoria, vai funcionar?? com suas correções

Pode funcionar, mas será que funcionará corretamente?

Novamente, a partir de seu problema:

Smartemiy:

"Uma venda é feita a 1.4545... preço vai contra a tendência - 1.4585... e ENTÃO - uma ordem pendente deve ser colocada a 1.4565".

Uma ordem de venda foi aberta. OrderOpenPrice() retornará 1.4545.

O preço vai contra a tendência. Perguntar = 1,4585. Condição:

if (OrderOpenPrice()-Ask <= -40*Point)

Funcionará (colocar um sinal "<=").

Vamos analisar o seguinte código:

order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);

Um pedido de BUYLIMITpendente é estabelecido ao preço de 1,4545-20*Ponto = 1,4525. Deve ser 1.4565.


Mas antes de fazer isso, tente reescrever o código inteiro. Há muitos erros, e alguns fragmentos parecem não entender o que você está escrevendo.