Correção definitiva de preços
tenta algo assim...
#define ASK SymbolInfoDouble(Symbol(), SYMBOL_ASK) //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { Custom *custom=new Custom(Symbol()); Print("Sem normalização: ", ASK); Print("Com normalização: ",custom.NormalizePrice(ASK+custom.StepToPrice(2))); delete custom; } //+------------------------------------------------------------------+ class Custom { private: int m_digits; string m_symbol; public: Custom(string symbol) : m_symbol(symbol) { } double NormalizePrice(const double price) const { return(NormalizeDouble(price,m_digits)); } double StepToPrice(int price_step) { double price = SymbolInfoDouble(m_symbol, SYMBOL_POINT)*(double)price_step; return price; } };
...
Vc esta mandando volume 0, vai tomar erro mesmo.
E mais uma obs. da forma que eu lhe mostrei funciona em qualquer ativo, basta usar a pontuação de cada ativo.
exemplo
indice : 1,2,3..
Dolar:0.500,1000,1500,.....
ações 0.01,0.02,....
Vc esta mandando volume 0, vai tomar erro mesmo.
Meu lote é dinamico, eu uso isso aqui como função auxiliar:
double Lote() { current_vol = LastVolume(); double vol_initial = lot; double ticksize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); if(LastResult() < 0 && Recover == 1) { //Martingale current_vol *= VolumeMult; if(current_vol > VolumeMax) { current_vol = VolumeMax; } } else if(LastResult() > 0 && Recover == 2) { //AntiMartingale current_vol *= VolumeMult; if(current_vol > VolumeMax) { current_vol = VolumeMax; } } else if(LastResult() > 0 && Recover == 3) { //SorosWin current_vol += lot; if(current_vol > VolumeMax) { current_vol = VolumeMax; } } else if(LastResult() < 0 && Recover == 4) { //SorosLoss current_vol += lot; if(current_vol > VolumeMax) { current_vol = VolumeMax; } } else if(LastResult() <= 0 && Recover == 5) { //Kamikaze current_vol = MathRound(MathAbs(LastResult())/((takeprofit)/ticksize)); } else { current_vol = vol_initial; } return current_vol; }
Meu lote é dinamico, eu uso isso aqui como função auxiliar:
Tentei mudar para isso, vou testar:
current_vol = (LastVolume()<=0) ? 1 : LastVolume();
...
não faça assim...pois em mercados com lotes maiores ou menores dara erro.
faz assim, no OnInit()
static double lotTemp = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN); if(m_lot < lotTemp) m_lot = lotTemp;
não faça assim...pois em mercados com lotes maiores ou menores dara erro.
faz assim, no OnInit()
Eu tentei mas não deu.
acho que essa função de calculo de lot que eu fiz que está muito "porca", vou refazer.. mtos ifs.. elses.. nuncam dão certo.
Eu tentei mas não deu.
acho que essa função de calculo de lot que eu fiz que está muito "porca", vou refazer.. mtos ifs.. elses.. nuncam dão certo.
double Lote() { if(current_vol <= lot) current_vol = lot; else(current_vol = LastVolume()); if(LastResult() < 0 && Recover == 1) //Martingale current_vol *= VolumeMult; if(current_vol > VolumeMax) current_vol = VolumeMax; else if(LastResult() > 0 && Recover == 2) //AntiMartingale current_vol *= VolumeMult; if(current_vol > VolumeMax) current_vol = VolumeMax; else if(LastResult() > 0 && Recover == 3) //SorosWin current_vol += current_vol; if(current_vol > VolumeMax) current_vol = VolumeMax; else if(LastResult() < 0 && Recover == 4) //SorosLoss current_vol += current_vol; if(current_vol > VolumeMax) current_vol = VolumeMax; else if(LastResult() < 0 && Recover == 5) //Kamikaze current_vol = MathRound(MathAbs(LastResult())/((takeprofit)/ticksize)); else current_vol = lot; return current_vol; }

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
vocês já passaram por isso e o que fizeram para corrigir ? Eu tentei criar um script para me ajudar a analisar as mais diversas possibilidades, mas não adianta, não consigo deixar algo universal (forex, B3, etc)