Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 722

 
Alexey Viktorov:
Sim, bem... Onde posso encontrar um corretor assim... Pode dar-me um link?
É isso mesmo. A compra fecha na Bid
 
Peço desculpa pela minha falta de atenção. Eu li "abre"...
 

Boa tarde,

Pergunta:

Pode dizer-me por favor porque não posso colocar uma compra pendente?

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Se offset=1 , então apareceráum erro:

paragem de compra falhada 0,10 AUDNZD.m a 1,03748 [preço inválido],ou seja,pequeno nível preço (em meucaso )

Quando a mesma "ordem de execução" é colocada logo a seguir

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

tudo funciona bem (ou seja, a encomenda é feita):

comprar 0,10 a 1,03747 [#2 comprar 0,10 AUDNZD.m a 1,03747]

Porque não é aceite o pedido de uma encomenda pendente(1.03748), ou seja,a 1.03747 é colocado, mas a 1.03748 não o é? (porqueSYMBOL_ASK tem em conta o spread e a compensação - a compensação do preço actual para colocar a encomenda, em pontos, é aumentada em 1)

Mas em compensação=100: preço pendente BUY_STOP = 1,03847 - já funciona


Obrigado.
 
Konstantin_78:

Boa tarde,

Pergunta:

Pode dizer-me por favor porque não posso colocar uma compra pendente?

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Se offset=1 , então apareceráum erro:

paragem de compra falhada 0,10 AUDNZD.m a 1,03748 [Preço inválido], ou seja,nível de preço pequeno (no meu caso)

Quando estabeleço uma "ordem de execução" imediatamente após

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

tudo funciona bem (ou seja, a encomenda é feita):

comprar 0,10 a 1,03747 [#2 comprar 0,10 AUDNZD.m a 1,03747]

Porque é que o pedido de uma encomenda pendente(1.03748) não é aceite, ou seja,em 1.03747 a encomenda é feita, mas em 1.03748 a encomenda é pequena?

Mas se offset=100: preço BUY_STOP pendente = 1,03847, já funciona.


Obrigado.

Já respondeu à sua própria pergunta.

Existe um parâmetro "stoplevel" -- distância mínima necessária entre o preço actual e o preço de colocar uma ordem pendente -- para cada símbolo tem o seu próprio valor e é definido nas condições de negociação

 
Andrey F. Zelinsky:

Вы же сами и ответили на свой вопрос.

Есть такой параметр stoplevel -- минимально необходимое расстояние от текущей цены до цены установки отложенного ордера -- для каждого инструмента своё значение и задаётся в торговых условиях 

Então seria provavelmente justo escrever

preço =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)*point

Embora, se escreveu "...a partir do preço actual ", o que é que isso tem a ver com o spread? Que está incluído em SYMBOL_ASK (porque SYMBOL_ASK = preço aberto + spread).

 
Vladimir Karputov:

Anexei um exemplo para o ajudar...

Estou a ver, o exemplo ajudou. Obrigado.


Agora, aqui vai uma pergunta.

Quando aumento o lote, a dada altura não há fundos livres suficientes, e preciso de abrir com o aumento do lote.

Ou seja, entrar no lote máximo, tanto quanto o FreeMargin permite.

Como escrever esta condição: se não houver fundos suficientes para abrir a posição com lote calculado, a função deve devolver o máximo lote possível para abrir a posição.

double LotA()
{
   double Lot=FirstLot;

   if(DoublingCount<=0) return Lot;
   double MaxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double MainLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(Lot<MainLot)Lot=MainLot;
     if(Lot>MaxLot)Lot=MaxLot;
   double lt1=Lot;
   HistorySelect(0,TimeCurrent());
   if(HistoryOrdersTotal()==0)return(Lot);
   double cl=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-1),ORDER_PRICE_OPEN);
   double op=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_PRICE_OPEN);

   long typeor=HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_TYPE);
   if(typeor==ORDER_TYPE_BUY)
     {
      if(op>cl)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(typeor==ORDER_TYPE_SELL)
     {
      if(cl>op)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(lt1>MaxLot)lt1=MaxLot;
   lt1=LotCheck(lt1);
   return(lt1);
  }
//+------------------------------------------------------------------+}
 
Marina Korotkih:

Estou a ver, o exemplo ajudou. Obrigado.


Agora esta questão.

Quando aumento o lote, a dada altura não há fundos livres suficientes, e preciso de abrir com um lote maior.

Ou seja, entrar no lote máximo, tanto quanto o FreeMargin permite.

Como escrever esta condição: se não houver fundos suficientes para abrir a posição com lote calculado, então a função deve retornar o máximo lote possível para abrir a posição.

               

double Mgn,Lot=0,BID,ASK;

    BID=SymbolInfoDouble(_Symbol,SYMBOL_BID);
    ASK=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

   if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, que tal isto?

Aplica duas opções de cálculo - uma para abrir VENDA, e outra para abrir COMPRA

 
Renat Akhtyamov:

                  if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

                  if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, poderia ser assim?

Não, não é.

Não precisa apenas de calcular o lote máximo possível, mas também de verificar o mínimo permitido, porque pode acontecer que o lote mínimo seja 0,01, e a margem permite abrir apenas 0,009, depois atormentar o servidor com pedidos que nunca serão aceites, mas eles podem tomar medidas contra si)

 
Vitaly Muzichenko:

Não, não é.

Não precisa apenas de calcular o lote máximo possível, mas também de verificar o mínimo permitido, porque pode acontecer que o lote mínimo 0,01, e a margem lhe permita abrir apenas 0,009, depois torturar os pedidos do servidor, que nunca aceitará, mas a acção sobre si e pode tomar)

Escreva o código completo, como deve ser, e eu verei ao mesmo tempo....?

Aprenderei sempre contigo e estarei sempre de olho em ti para garantir que as respostas estão completas.

Eu costumava trabalhar como supervisor técnico, não se preocupe, tudo vai ficar bem!

Juntos somos uma equipa!

 
Marina Korotkih:

Estou a ver, o exemplo ajudou. Obrigado.


Agora esta questão.

Quando aumento o lote, a dada altura não há fundos livres suficientes, e preciso de abrir com um lote maior.

Ou seja, entrar no lote máximo, tanto quanto o FreeMargin permite.

Como escrever esta condição: se não houver fundos suficientes para abrir a posição com lote calculado, a função deve devolver o máximo lote possível para abrir a posição.


Um declive escorregadio em que se está).
Razão: