Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1257

 
por que o tempo e os pontos de preço 2 a 30 estão disponíveis noObjectCreate? tentou adicionar ao gráfico, apenas o primeiro ponto é mostrado
ObjectCreate(0,"name",OBJ_ARROW_LEFT_PRICE,0,TimeCurrent()-600,1.29400,TimeCurrent()-1200,1.29500);   
 
Valerius:

Você não precisa escrever este código no OnInit, mas no OnTick().

Eu tentei, não funciona em absoluto.
1 aviso
 
Igor Makanu:

Não, você não pode.

Não consigo explicar como funcionam os modelos.... é assim - até que você chame tal função, o compilador não sabe nada sobre sua existência (muitas vezes, não há sequer erros de compilação se não houver chamada)

então você chama tal função de modelo e o compilador preenche os tipos necessários e só então verifica se tudo vai funcionar corretamente

e então você faz outra chamada ao modelo com diferentes tipos de parâmetros - e o compilador cria uma nova função, ou seja, mais uma, ou seja, como se você escrevesse 2 funções, que fazem a mesma coisa, mas com diferentes tipos de parâmetros


whew, é assim que funciona ))))



UPD:

você pode, mas se os tipos no modelo corresponderem, aqui está um exemplo, ele funciona corretamente:

Obrigado, ainda mais claro do que nos docs) Acontece que na predefinição do modelo de variáveis não permite não especificá-las. Preciso dele para imprimir para um arquivo. O registro não me dá a opção de dividir os registros. Gostaria que houvesse 5 logs). Como resultado, os modelos dão a opção de não trazer o tipo de variável para a desejada, ela pode ser feita dentro de uma função de modelo, mas o número de variáveis deve ser especificado por completo. E uma função simples com variáveis pré-definidas do tipo requerido dá uma oportunidade de especificar menos variáveis em uma chamada, mas os tipos de variáveis devem ser trazidos para a variável requerida. É claro que isto pode ser feito durante a chamada, mas o registro será muito longo.

 
Valerius:

Boa tarde a todos!

Fiz uma função para modificar a perda de carga. Mas quando funciona, dá EURUSD,H1: OrderModify error 130.

E o preço está longe do local onde deve ser fixado o stoploss.

Aqui está a função:


....
    err=OrderModify(OrderTicket(), OrderOpenPrice(),New_Stop( NormalizeDouble(OrderOpenPrice()+spred*point, 
digits)), OrderProfit(), 0, clrNONE);// Цена открытия плюс спред может быть в зоне заморозки.
.....
.....
double New_Stop(double Parametr) // Проверка стоп-прик.
  {
   double Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Increased the distance of a stop order or the opening price of pending orders.");
     }
   return(Parametr);                            // Возврат значения
  }
 
Valerius:

Tente desta forma:


Obrigado, funcionou!

Mas mais duas nuances:

1 que condição acrescentar para não fechar pedidos que foram abertos na sexta-feira da semana atual e nas sextas-feiras das semanas anteriores, respectivamente, foram fechados ?

2. como corrigir o código - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);

para remover"possível perda de dados devido à conversão do tipo" aviso? Parece ser sobre "...MarketInfo(nameSym,MODE_DIGITS)...".

 
Boa noite. Como deve ser o código que seleciona o pedido mais recentemente fechado? É realmente assim:"OrderSelect(OrderHistoryTotal, SELECT_BY_POS, MODE_HISTORY"?
 
GetAmountLotFromOpenPos devolve a função -1717986918 como posso consertá-la?
 

Por favor, informe.

No testador, o valor de retorno da função de soma de lote GetAmountLotFromOpenPos dá um valor de -1717986918.

 
Valeriy Yastremskiy:

Eu encontrei a razão. Eu deveria ter colocado OrderTakeProfit() em OrderModify ao invés de OrderProft(). Dei uma pequena olhada.

De qualquer forma, obrigado pela ajuda.

 
Yerkin Sagandykov:

Obrigado, funcionou!

Mas mais duas nuances:

1 que condição acrescentar para não fechar pedidos que foram abertos na sexta-feira da semana corrente, e nas sextas-feiras das semanas anteriores, respectivamente, foram fechados?

2. como corrigir o código - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);

para remover"possível perda de dados devido à conversão do tipo" aviso? Deve ser sobre "...MarketInfo(nameSym,MODE_DIGITS)...".

Para a primeira pergunta, você precisa fazer esta função:


for(int is=OrdensTotal()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{//Fechar pedidos que foram abertos na sexta-feira da semana que não é a semana atual. Neste caso, não estamos fechando pedidos na sexta-feira da semana corrente.
if(OrderMagicNumber()==Magic && TimeDayOfWeek(TimeCurrent())==5 && TimeDayOfWeek(OrderOpenTime())==5 && TimeDayOfYear(OrderOpenTime())<TimeDayOfYear(TimeCurrent())
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);
if(!result) {error=GetLastError(); Print("LastError = ",error, ",Symbol()); }
senão {error=0;}
senão
{Print("NoMagic ",OrderMagicNumber();} // para Debug
senão

{Imprimir("Erro ao selecionar o pedido", GetLastError();}


Para a segunda pergunta, deve haver a seguinte entrada:

OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(MarketInfo(nameSym,MODE_ASK)), 3, clrNONE);

Boa sorte.