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

 
O terminal simplesmente descarta todos os caracteres extras.

Se você abrir com este volume:
0.029

abrirá 0,02 lotes

e se abrir com esse volume:

NormalizeDouble(0.029,2)
abrirá 0,03 lotes.
 
multiplicator:

Como calcular o número de casas decimais?

por exemplo, descobri que o lote mínimo é 0,01.

como posso deduzir que o número de casas decimais é 2?
para normalizar o volume de pedidos com duas casas decimais.

aqui está a palavra de ordem:
void OnStart()
  {
  double minlot=MarketInfo(Symbol(),MODE_MINLOT);
  Alert(d(minlot));
  }




int d(double x)
{
   int n;
   for(n=0;n<8;n++)
   {
      if(x==NormalizeDouble(x,n))      
      {
         return(n);
      }
   }
return(n-1);
}
 
multiplicator:
O terminal simplesmente descarta todos os sinais extras.

Se abrirmos com este volume:

abrirá 0,02 lotes.

e se você abrir com esse volume:

abrirá 0,03 lotes.

E se você precisar abrir 0,25 lotes? Aqui estão prontas e funcionando funções, leia-as e use-as.

https://www.mql5.com/ru/forum/131859/page8#comment_3359730


multiplicador:

por exemplo, colocamos o valor na função: 7 lotes.
O corretor tem um volume de lote mínimo de 5 e um incremento de lote de 2.

aqui está minha função de normalização de lote, eu a uso há muito tempo, ninguém reclamou ainda, lá você pode descobrir o incremento de lote e depois arredondá-lo para o número de dígitos do incremento de lote

//_______________________________________________________________________
//Нормализация объема лота для ордера up=true - в большую сторону, иначе в меньшую
//_______________________________________________________________________
double NormalizeLot(double value, bool up=false){
   double res,sizetable[9] = {1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, 0.00000001};
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   int lotdigits;
   for (lotdigits=8; lotdigits>=0 ; lotdigits--) if (lotStep <= sizetable[lotdigits]) break;
   if(up) res = NormalizeDouble(MathCeil(MathMin(MathMax(value, MarketInfo(Symbol(),MODE_MINLOT)), MarketInfo(Symbol(),MODE_MAXLOT))/lotStep)*lotStep,lotdigits); 
         else res = NormalizeDouble(MathFloor(MathMin(MathMax(value, MarketInfo(Symbol(),MODE_MINLOT)), MarketInfo(Symbol(),MODE_MAXLOT))/lotStep)*lotStep,lotdigits);
return(res);}
//_______________________________________________________________________
Bem, se você encontrou um servidor que tem um passo de lote, por exemplo, 0,37, então há apenas adição e comparação com o lote necessário no loop, mas não havia tais servidores, parece que há lotes não-standard em bitcoin, eu não me envolvi, eu não sei, você precisa de uma situação específica
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Bom dia caros colegas, por favor, ajudem-me a soletrar corretamente a condição na minha EA para entrar em uma profissão no SHI_silvertrend_signal indicator signals on binary options, somente OP_SELL e OP_BUY. para M1 e M5. O sinal chega ao final da vela anterior.


- Para abrir uma ordem no momento do sinal do indicador, somente na primeira vela após o sinal

- não mais que 5 segundos a partir do momento em que o sinal é recebido.

- Mudança de preço aceitável dentro da Slippage



(O indicador tem 2 amortecedores)

do comentário indicador// ambos os amortecedores a serem preenchidos com zeros. Caso contrário, haverá lixo ao mudar o cronograma.

Obrigado antecipadamente por sua ajuda e apoio!

void OnTick()

{

.....

  if((CountSell() + CountBuy())== 0 && isTradeHours())

   {

      SignalBuy = iCustom(NULL, 0, "SST", AllBars, Otstup, Per, 0,0); //получаемое значение в формате 4546546549.0 

      SignalSell = iCustom(NULL, 0, "SST", AllBars, Otstup, Per, 1,0);



      if((Ask <= SignalBuy - Slippage*Point || Ask  <= SignalBuy + Slippage*Point) && iBarShift(NULL, 0,TimeSeconds(TimeCurrent())))    //<---- помогите дописать условие

      {

         if(OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,IntegerToString(Expiration), Magic, 0, Blue) > 0)

         {

            Print("Ордер на покупку открыт!");

            return;

         }else Print("Ошибка открытия ордера на покупку!");

      }  

         

      if((Bid >= SignalSell - Slippage*Point || Bid >= SignalSell + Slippage*Point) && iBarShift(NULL, 0,TimeSeconds(TimeCurrent())))  //<---- помогите дописать условие

      {  

      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0,IntegerToString(Expiration), Magic, 0, Red) > 0)

         {

            Print("Ордер на продажу открыт!");

            return;

         }else Print("Ошибка открытия ордера на продажу!");

      }

   }

}

.......

O código do próprio indicador (encontrado na Internet, se a publicação do código não contradizer as regras do fórum?)

//+------------------------------------------------------------------+
//|                                           SHI_SilverTrendSig.mq4 |
//|       Copyright © 2003, VIAC.RU, OlegVS, GOODMAN, © 2005, Shurka |
//|                                                 shforex@narod.ru |
//|                                                                  |
//|                                                                  |
//| Пишу программы на заказ                                          |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Shurka"
#property link      "http://shforex.narod.ru"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
#define   SH_BUY   1
#define   SH_SELL  -1

//---- Входные параметры
extern int     AllBars=0;//Для скольки баров считать. 0 - для всех.
extern int     Otstup=30;//Отступ.
extern int     Per=9;//Период.
int            SH,NB,i,UD;
double         R,SHMax,SHMin;
double         BufD[];
double         BufU[];
//+------------------------------------------------------------------+
//| Функция инициализации                                            |
//+------------------------------------------------------------------+
int init()
{
   //В NB записываем количество баров для которых считаем индикатор
   if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
   IndicatorBuffers(2);
   IndicatorShortName("SST");
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(0,159);
   SetIndexArrow(1,159);
   SetIndexBuffer(0,BufU);
   SetIndexBuffer(1,BufD);
   SetIndexDrawBegin(0,Bars-NB);//Индикатор будет отображаться только для NB баров
   SetIndexDrawBegin(1,Bars-NB);
   ArrayInitialize(BufD,0.0);//Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
   ArrayInitialize(BufU,0.0);
   return(0);
}
//+------------------------------------------------------------------+
//| Функция деинициализации                                          |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
//| Собсна индикатор                                                 |
//+------------------------------------------------------------------+
int start()
{
   int CB=IndicatorCounted();
   /* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
   посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
   не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
   то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
   обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
   и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
   до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
   if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
   for (SH=1;SH<NB;SH++)//Прочёсываем график от 1 до NB
   {
      for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);}      R/=55;

      SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)];
      SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
      if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufD[SH]=High[SH]+R*0.5; UD=SH_SELL; }
      if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufU[SH]=Low[SH]-R*0.5; UD=SH_BUY; }
   }
   return(0);
}
 

Igor Makanu:

res = NormalizeDouble(MathFloor(MathMin(MathMax(value, MarketInfo(Symbol(),MODE_MINLOT)), MarketInfo(Symbol(),MODE_MAXLOT))/lotStep)*lotStep,lotdigits);


(Que reviravolta. matmax, depois matmin. )

 

onde está faltando a chave de otimização?



como otimizar????


 

Por favor, informe como especificar corretamente a condição para entrar em uma profissão no sinal indicador.


Eu escrevi um simples Expert Advisor para os gráficos da Renko que se parece com isto:

extern double LotSize = 0.01;
extern int Magic = 1;

int prevtime = 0;

int start() {
 
   
//При образовании нового кубика ренко проверка на Buy или Sell и заключение ордера
   if (prevtime != Time[0]) {

   if (Close[1] > Open[1]) {
      OrderSend(Symbol(), OP_BUY, LotSize, ND(Ask), 3, 0, 0,  "RG", Magic, 0, Blue);
      }
   if (Close[1] < Open[1]) {
      OrderSend(Symbol(), OP_SELL, LotSize, ND(Bid), 3, 0, 0, "RG", Magic, 0, Red);
      }
      Magic++;
   prevtime = Time[0];
    }
        return(0);
} 

double ND(double np) {
  return(NormalizeDouble(np,Digits));
}


Não estou muito satisfeito com o gráfico offline e decidi combiná-lo com o indicador AG_Renko_Chart. Estou anexando-o à minha mensagem.

Mas aqui está como a função que retorna o valor renko na borda direita:

iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,0,0);

Não consigo entender como distinguir entre barra para baixo ou barra para cima. E como prescrever adequadamente uma função que não faria muitos ofícios ...


Em geral, minha cabeça não está pensando direito. Ajuda por favor!!!!

Arquivos anexados:
 
Roman Shiredchenko:

onde está faltando a chave de otimização?



como otimizar????


Isto é uma piada ou uma piada social???


 
Alexey Viktorov:

Isso é uma piada ou você está fazendo pouco da sociedade?


Não é uma brincadeira e não é assim que estou zombando da sociedade.

Dê uma boa olhada na foto antes de publicar heresias.

 
Roman Shiredchenko:

não é uma brincadeira e não é assim que eu troço.

Olhe a foto com cuidado antes de postar heresia.

O problema é a resolução da tela.