[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 118

 
Shixan:

Boa tarde.

Eu escrevi código para abrir duas ordens pendentes (BuyStop e SellStop) nas condições a=true e b=true e após algum tempo a EA fecha ambas as ordens, até que um novo sinal apareça, mas às vezes a EA abre 2 ordens pendentes na mesma direção. Por que isso acontece e como evitar esse "bug"?



se (a=verdadeiro &&& b=verdadeiro)
{
int OrderCount = OrderTotal();
se (OrderCount>1) retornar(0);
ticket1=OrderSend(Symbol(), OP_BUYSTOP, getLot(), PriceOpen_Buy, slippage, PriceOpen_Sell,0,0,Green);
Sleep(1000);

ticket2=OrderSend(Symbol(), OP_SELLSTOP, getLot(), PriceOpen_Sell, slippage, PriceOpen_Buy,0,0,Green);

Sleep(1000*59*TimeFrame);

para (int i=OrdensTotal()-1; i>=0; i--)
{
se (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) quebrar;
se (OrderType()==OP_BUYSTOP ) OrderDelete(OrderTicket());
se (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket());
se (OrderType()==OP_SELL ) OrderClose(OrderTicket(),OrderLots(),Ask, slippage);
se (OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,slippage);
}

retorno(0);

}


Você pode me dar uma dica?

Agradecemos antecipadamente

Eu ainda não vi o seu código, mas... para NÃO colocar dois ou mais pedidos em UM sinal, faça uma verificação ANTES de colocar um pedido: já existe um pedido colocado neste sinal? Se não - colocar para cima, se houver - fumaça.
 
mario065:

Olá,

É possível inserir um horário com um peso fixo 1:1 nos ajustes?

Diga-me como fazer isso, se for possível.

Obrigado de antemão.

Esta biblioteca pode.

Seção "3.3 Função para definir as propriedades do gráfico" função ServiceSetScaleFix1To1().

A biblioteca funciona apenas com as localizações em russo e inglês. Pode funcionar no seu também.

 
Olá, você poderia me dizer porque no novo build 451 no MetaEditor quando você compila, o segundo arquivo ex 4 não aparece na pasta de especialistas ao lado do arquivo mq 4
 

Aqui está a função de abertura do pedido:

//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         if (!OrderModify(ticket, OrderOpenPrice(), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

Aqui está a impressão dos parâmetros:

2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4499
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4519
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4513
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4515
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #1 sell stop 0.10 EURUSD at 1.45091 ok

Aqui você pode ver claramente que o preço TP e SL estão abaixo e acima do Ask e Bid respectivamente, ou seja, tudo está correto. Mas por alguma razão recebo um erro de modificação porque a parada está errada. Como assim?

 
hoz:

Aqui está a função de abertura do pedido:

Aqui está a impressão dos parâmetros:

Aqui você pode ver claramente que o preço TP e SL estão abaixo e acima do Ask e Bid respectivamente, ou seja, tudo está correto. Mas por alguma razão recebo um erro de modificação porque a parada está errada. Como assim?

Você lê ao menos o que está sendo repreendido?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Valor do parâmetro da função inválida

Se você não entender nada, nós resolvemos isso com o resto do mundo.

ZZY. Quando você faz um pedido pendente, o fio

if (price < Bid)

Quando você faz um pedido pendente, o cordel não deve ser muito relevante. Deve ser verificada a correspondência com a distância mínima permitida definida em MarketInfo(Symbol(), MODE_STOPLEVEL). A primeira coisa que me chamou imediatamente a atenção.

A segunda é imprimir o preço ao qual o pedido é feito. O Stop and Take não deve ser estabelecido em relação ao Ask and Bid, mas sim em relação ao preço de estabelecimento do pedido

 
Zhunko:

Esta biblioteca pode.

Seção "3.3 Funções de ajuste de propriedade gráfica" função ServiceSetScaleFix1To1().

A biblioteca funciona apenas com localizações em russo e inglês. Pode funcionar no seu também.

Obrigado Zhunko.
 
artmedia70:

Você lê ao menos o que está sendo repreendido?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Valor inválido do parâmetro de função

Veja os parâmetros passados para a função chamada. Quando nada ficar claro, vamos resolver isso em paz...


Claro que estou lendo, é por isso que estou curioso. Eu desvinculei todos os parâmetros de entrada.

Isto é o que eu tenho:

bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         Print("ND(price) = ", DoubleToStr(ND(price),Digits));
         Print("ND(SL) = ", DoubleToStr(ND(SL),Digits));
         Print("ND(TP) = ", DoubleToStr(ND(TP),Digits));
         Print("ND(OOP) = ", DoubleToStr(ND(OrderOpenPrice()),Digits));
         if (!OrderModify(ticket, ND(OrderOpenPrice()), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

Aqui está o que está no diário de bordo:

2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4485
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4505
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4496
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4497
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(OOP) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(TP) = -0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(SL) = 0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(price) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #4 sell stop 0.10 EURUSD at 1.44946 ok

Algumas das ordens são modificadas e outras não. Os valores de ND(TP), ND(SL) logo no início foram retornados ao acaso. Por quê?

A função de normalização, a propósito, é minha:

//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
 
artmedia70:

Você lê ao menos o que está sendo repreendido?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Valor inválido do parâmetro de função

Veja os parâmetros passados para a função a ser chamada. Quando nada estiver claro, nós resolvemos isso com o mundo...

ZS. Quando você coloca uma ordem pendente a linha

if (price < Bid)

Isto não é muito apropriado. Você deve verificar se a distância mínima permitida corresponde àquela especificada em MarketInfo(Symbol(), MODE_STOPLEVEL). A primeira coisa que me chamou logo a atenção.



Geralmente encontro tais verificações para modificação de pedidos, mas não para abertura. Já vi isso. Se eu fixar o preço pendente para bystop, será um erro. E se eu definir uma parada de 10 pips será certamente maior do que o valor StopLoss. Eu não negocio com carrapatos :)
 
artmedia70:


Em segundo lugar, imprimir o preço ao qual o pedido é feito. O Stop and Take não deve ser colocado em relação ao Ask and Bid, mas em relação ao preço ao qual o pedido é feito



Presumo que isto seja para modificação? Afinal, é o Bid and Ask que é importante para nós quando abrimos o pedido. Eu arrumei tudo com o posto acima.
 

Boa tarde,

Quero fazer uma EA trabalhar em várias janelas ao mesmo tempo. Mas apenas um pedido pode ser aberto para cada instrumento. Portanto, agora existe uma condição:

int total = EncomendasTotal();

se (total<1) { análise e bloco de posição aberta} ou { análise e bloco de posição fechada }

Agora, se ela for aberta em dois símbolos ao mesmo tempo, a abertura em um deles será bloqueada no outro. É por isso que inventei algo semelhante:

int total = EncomendasTotal();

int cnt;

if(total>0)
{
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
Símbolo_FLAG = verdadeiro;
}
}
}

if(total<1 || total>0 && Symbol_FLAG == falso) { análise e abertura ptposition block}

mas não funciona com o testador...

Talvez você possa me dizer, talvez eu esteja tramando algo irrealizável?