[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 220

 
alsu:
Você acertou. Além disso, quando retiramos um valor da caixa, ele é do tipo duplo, mas se o comando for dado para escrever o resultado em uma variável do tipo int, o compilador tomará automaticamente todas as medidas necessárias para colocar o valor em uma nova caixa.


Para finalmente ter certeza de que entendi bem, por favor, verifique meus pensamentos sobre seu último parágrafo... Portanto, vamos ter o especialista acima mencionado:

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

Em seguida, no fio:

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

Colocamos uma variável de tipo inteiro Peritos na caixa "GV-variável" para armazenamento (convertendo-a para tipo duplo). Então se (hipotética suposição) houvesse uma seqüência no Expert Advisor

int New_Experts=Experts;

isso significaria que existe um comando para escrever o resultado em uma variável do tipo int. Neste caso, o compilador:

* tiraria o valor da variável do tipo duplo da caixa,

* fazer quaisquer alterações necessárias no valor da variável Peritos,

* atribuir este valor à variável New_Experts e...

* coloque o valor da variável New_Experts em uma caixa "int".

Portanto, o tipo de variável nada mais é do que apenas um invólucro/embalagem externa de algum valor? e, portanto, as variáveis GV não podem ser do tipo string, pois o downgrade só é permitido para valores numéricos, e as strings não são convertidas em números.

Certo?

Agradecemos antecipadamente a sua resposta.

 
Stells:
para que não (f=1;f<Bars;f++)
{
Price1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT)
Price2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT);
Spread = Price1 - Price2;
Print ("Price1="+Price1, " Price2="+Price2);
se (Spread==0){t=f; break;}
}
Price12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT);
Price22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT);
Spread2 = Price12 - Price22;


if (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { open trade }


querer fixar a barra onde o spread era igual a zero e controlar o spread a partir dela

if(MathAbs(Spread)<eps) { ........ } e você ainda precisa controlar o resultado - se o ponto que satisfaz a condição é encontrado ou não. IMHO é melhor criar uma função separada, por exemplo, como esta

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

Olá.

Você sabe se existe um #propriedade nos indicadores que permite que o indicador mostre sempre o mesmo período, por exemplo, d1?

e não muda mesmo se você mudar os prazos no MetaTrader?

obrigado

------------------------------------------

oh.... quantos pros.....

 

ajuda!!!!

como chamar o indicador a partir do roteiro, eu realmente preciso que ele seja exibido em uma janela

 

Boa noite! Por favor, ajude-me a fazer mudanças no código EA:
1. Quando se testa tudo está bem - mas quando se negocia, a primeira negociação tem que ser aberta manualmente, parar e tomar também. Eu gostaria que a EA começasse a negociar automaticamente quando o preço chegasse a um novo tick.
2. Como no caso de uma perda de parada acionada, a próxima posição é aberta com o dobro do lote anterior, o lote pode teoricamente aumentar até o infinito (no meu caso, até 51,2), eu gostaria de limitá-la (por exemplo 0,8) com a capacidade de mudar o limite. Quando o limiar é atingido e uma parada é acionada, a EA não desconectaria, mas recomeçaria a partir de 0,1.

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

Ajude, por favor. Tenho lutado o dia todo sem nenhuma ajuda.

O pedido está na pickup (BAY principal, pendente de venda como segurança).

Ao fechar o sellsstop no no-loss, adiado novamente no mesmo local.

Rodar esta coisa,https://www.mql5.com/ru/code/8846.
 
7777877:


Para finalmente ter certeza de que entendi bem, por favor, verifique meus pensamentos sobre seu último parágrafo... Portanto, vamos ter o especialista acima mencionado:

Em seguida, no fio:

Colocamos uma variável de tipo inteiro Peritos na caixa "GV-variável" para armazenamento (convertendo-a para tipo duplo). Então se (hipotética suposição) houvesse uma seqüência no Expert Advisor

isso significaria que existe um comando para escrever o resultado em uma variável do tipo int. Neste caso, o compilador:

* tiraria o valor da variável do tipo duplo da caixa,

* fazer quaisquer alterações necessárias no valor da variável Peritos,

* atribuir este valor à variável New_Experts e...

* coloque o valor da variável New_Experts em uma caixa "int".

Portanto, o tipo de variável nada mais é do que apenas um invólucro/embalagem externa de algum valor? e, portanto, as variáveis GV não podem ser do tipo string, pois o downgrade só é permitido para valores numéricos, e as strings não são convertidas em números.

Certo?

Agradecemos antecipadamente pela resposta.

Não exatamente. A questão é que a variável Peritos já tem o tipo int, portanto, a conversão do tipo deve ocorrer ANTES da atribuição de um valor a ela, ou seja, o compilador

* tirou da caixa um valor do tipo duplo (não tem nome em seu programa, e é escrito simplesmente em algum endereço conhecido do compilador na memória principal ou no registro da CPU)

* fez todas as mudanças necessárias no valor da variável acima e escreveu um novo valor (do tipo int!) na variável Especialistas,

* atribuiu este valor (do tipo int!) à variável New_Experts. Eles têm o mesmo tipo, portanto é apenas uma questão de copiar um valor de um local de memória para outro.


P.S. É ótimo ver que há pessoas que compreendem seus atos com tanto detalhe. Na verdade, sem brincadeira. Mantenha-se em contato.

 
Andrew1001:

Boa noite! Por favor, ajude-me a fazer mudanças no código EA:
1. Quando se testa tudo está bem - mas quando se negocia, a primeira negociação tem que ser aberta manualmente, parar e tomar também. Eu gostaria que a EA começasse a negociar automaticamente quando o preço atingisse um novo tick.
Como no caso de uma perda de parada acionada, a próxima posição é aberta com o dobro do lote anterior, o lote pode teoricamente aumentar até o infinito (no meu caso, até 51,2), eu gostaria de limitá-la (por exemplo 0,8) com a capacidade de mudar o limite. Quando o limite é atingido e uma parada é acionada, o Expert Advisor não se desliga e começa de novo a partir de 0,1.


Experimente:

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
Olá. Você pode me dizer onde posso ler como fazer transações no testador, por mim mesmo? Eu agradeceria.
 

Olá a todos.

Eu tenho um roteiro que encerra todas as encomendas disponíveis.

Eu não entendo três linhas nele:

Se não for difícil, por favor, traduza-o para o russo para um iniciante.

Eu estudei o tutorial, mas não me deparei com expressões lógicas tão longas.

O roteiro que estou anexando. Obrigado.

Arquivos anexados: