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

 
Igor Makanu:

provavelmente assim, para vender:

profit=NormalizeDouble((OrderOpenPrice()-Ask)*MarketInfo(_Symbol,MODE_TICKVALUE)*lot/Point,2);

para comprar por Bid, ou seja ( Bid -OrderOpenPrice())

TakeProfit =100 pontos Lote = 0,1, quanto será o lucro da posição aberta na moeda, quando a posição for fechada pela TP?

profit=NormalizeDouble((OrderOpenPrice()-Тейк_Профит*Point)*MarketInfo(_Symbol,MODE_TICKVALUE)*lot/Point,2);

não funciona dessa forma.

 
Vitaly Muzichenko:

Necessidade de operar:Lote -> Dinheiro -> Distância, e o custo do carrapato

O dinheiro é apenas o que se deve descobrir )

 
Vitaly Muzichenko:

A solução não leva em conta as comissões e as trocas. Os pontos parecem estar no lucro, mas os custos são uma perda.

Eu não gosto da fórmula OrderProfit()+ OrderComission()+OrderSwap() com comissões e swaps

A ajuda diz que a comissão pode estar em pontos ou em moeda de depósito, esta fórmula não leva isso em conta e pode fazer mais mal do que bem nos testes, mas isso é uma questão de gosto

Ghabo:

Take_Profit =100 pontos, lote =0,1, quanto será o lucro de uma posição aberta na moeda, quando a posição for fechada pela TP?

Não funciona assim.

A matemática não é sua coisa? ;)

caso contrário:

profit=NormalizeDouble((Take_Profit *Point)*MarketInfo(_Symbol,MODE_TICKVALUE)*lot/Point,2);

se encurtado, será

profit=NormalizeDouble(lot *TakeProfit*MarketInfo(_Symbol,MODE_TICKVALUE),2);

 
Vitaly Muzichenko:

O que se entende aqui é queOrderProfit() deve ser usado no cálculo

Como calcular o lote para uma posição antes de enviar um pedido para obter um lucro de USD 20 quando a TakeProfit entra em ação? A OrderProfit() não vai ajudar aqui - ainda não há posição.

Ou então: Qual seria o TakeProfit da posição futura, de modo que se eu abrisse com 0,1 lote eu teria um lucro de 20 USD? E aqui OrderProfit() não vai ajudar - pela mesma razão.

E de outra forma: Qual deve ser o Stop Loss na posição futura, para que quando eu abrir com 0,1 lote eu tenha uma perda de não mais do que 3% dos fundos disponíveis? E aqui OrderProfit() não vai ajudar - pela mesma razão.

Atualização: todos os cálculos serão aproximados sem conhecer a comissão e a troca. Teremos que ajustar as ordens de parada "no local" se precisarmos de precisão a um centavo ou um ponto.

 
Artyom Trishkin:

Antes de enviar uma ordem para abrir uma posição, como faço para calcular o lote para a posição futura, de modo que quando o takeprofit for acionado, eu obtenha um lucro de 20 USD? OrderProfit() não é útil aqui - ainda não há nenhuma posição.

Ou em outras palavras: Qual seria o TakeProfit da posição futura, de modo que se eu abrir com 0,1 lote eu teria um lucro de 20 USD? E aqui OrderProfit() não vai ajudar - pela mesma razão.

Eu apenas escrevi e entendi o que tinha que calcular antes de abrir e imediatamente apaguei a mensagem. Que inteligente de sua parte em responder)

Uma vez escrevi isso, e entrei um montante por 1 lote nos parâmetros de entrada como uma comissão.

 
Olá, eu não consigo entender, por favor, ajude-me. O que há de errado com este código? Eu exibo o valor médio no comentário e ele aumenta a cada tique? Ajuda:-))))
 for(shift = 0; shift <= Bars-1; shift++)
  {
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)
           {
           HZZ[ww]=zz;
           ww++;          
           }
  }
   
  
       for(ww=0;ww<=nn;ww++){
      if(HZZ[ww]>HZZ[ww+1]){SredRazmax += HZZ[ww];}     
      if(HZZ[ww]<HZZ[ww+1]){SredRazmin += HZZ[ww+1];}
      
       
  Comment("Средний размах = ", (SredRazmax-SredRazmin)/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]); 
 
Dmitry Belov:
aumenta a cada tique? Ajuda:-))))

significa que você está contando com cada tick do código que enviou e não inicializando as variáveisSredRazmax eSredRazmin

é um bom hábito inicializar variáveis antes de usar - é isso que as universidades lhe ensinam, reduz o tempo necessário para encontrar bugs ;)

 

Colegas, por que este código se recusa a executar no testador de estratégia, mas executa corretamente em tempo real. Estou falando especificamente sobre a função OnChartEvent(). No modo de visualização no testador, ele não é executado quando os botões são clicados.

input double lot=0.1;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ButtonCreate("ButtonBuy",100,100,200,40,"Buy",15,clrBlue);
   ButtonCreate("ButtonSell",100,200,200,40,"Sell",15,clrRed);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   long cid=ChartID();
   if(id==CHARTEVENT_OBJECT_CLICK && sparam=="ButtonBuy")
     {
      if(OrderSend(_Symbol,OP_BUY,lot,Ask,200,0,0,NULL,0,0,clrBlue)==-1)
         Print("Error: ",GetLastError());
      ObjectSetInteger(cid,"ButtonBuy",OBJPROP_STATE,false);
     }
   if(id==CHARTEVENT_OBJECT_CLICK && sparam=="ButtonSell")
     {
      if(OrderSend(_Symbol,OP_SELL,lot,Bid,200,0,0,NULL,0,0,clrRed)==-1)
         Print("Error: ",GetLastError());
      ObjectSetInteger(cid,"ButtonSell",OBJPROP_STATE,false);
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+ 
//| ButtonCreate                                                     | 
//+------------------------------------------------------------------+ 
void ButtonCreate(string name,int x,int y,int width,int height,
                  string text,int font_size,color back_clr)
  {
   long cid=ChartID();
   int subWind=0;
   ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER;
   string font="Cambria";
   color text_clr=clrBlack;
   color border_clr=clrBlack;
   bool state=false;
   bool back=false;
   bool selectable=false;
   bool selected=false;
   bool hidden=true;
   long zorder=0;
   if(ObjectFind(cid,name)==-1)
     {
      ObjectCreate(cid,name,OBJ_BUTTON,subWind,0,0);
      ObjectSetInteger(cid,name,OBJPROP_XDISTANCE,x);
      ObjectSetInteger(cid,name,OBJPROP_YDISTANCE,y);
      ObjectSetInteger(cid,name,OBJPROP_XSIZE,width);
      ObjectSetInteger(cid,name,OBJPROP_YSIZE,height);
      ObjectSetInteger(cid,name,OBJPROP_CORNER,corner);
      ObjectSetString(cid,name,OBJPROP_TEXT,text);
      ObjectSetString(cid,name,OBJPROP_FONT,font);
      ObjectSetInteger(cid,name,OBJPROP_FONTSIZE,font_size);
      ObjectSetInteger(cid,name,OBJPROP_COLOR,text_clr);
      ObjectSetInteger(cid,name,OBJPROP_BGCOLOR,back_clr);
      ObjectSetInteger(cid,name,OBJPROP_BORDER_COLOR,border_clr);
      ObjectSetInteger(cid,name,OBJPROP_BACK,back);
      ObjectSetInteger(cid,name,OBJPROP_STATE,state); 
      ObjectSetInteger(cid,name,OBJPROP_SELECTABLE,selectable);
      ObjectSetInteger(cid,name,OBJPROP_SELECTED,selected);
      ObjectSetInteger(cid,name,OBJPROP_HIDDEN,hidden);
      ObjectSetInteger(cid,name,OBJPROP_ZORDER,zorder);
     }
  }
//+------------------------------------------------------------------+
 
Oleg Remizov:

Colegas, por que este código se recusa a executar no testador de estratégia, mas executa corretamente em tempo real. Estou falando especificamente sobre a função OnChartEvent(). No modo de visualização no testador, ele não é executado quando os botões são clicados.

Porque a OnChartEvent() não funciona no testador no MT4. Verifique a bandeira de estado do botão no testador.
 
Artyom Trishkin:
Porque no MT4 OnChartEvent() não funciona no testador. Verifique a bandeira de estado do botão no testador.

Obrigado! Eu tinha essa suspeita, mas não encontrei informações na ajuda que a OnChartEvent() não funciona no testador.

Razão: