Olá, Vladimir,
Eu sempre encontro seus códigos. Este é outro bom EA. Eu lhe pergunto: eu preciso de um trailing stop.
Muito obrigado
Olá, Vladimir,
Alterei o código da camada polonesa escrito por você para meus próprios fins. Quero combinar os resultados de vários indicadores e extrair isso dos resultados. Como posso fazer isso?
Oi Vladimir,
Alterei o código da camada polonesa escrito por você para meus próprios fins. Quero combinar os resultados de vários indicadores e extrair isso dos resultados. Como posso fazer isso?
Descreva em detalhes o que você fez. Mostre o código. Diga-me o que mais precisa ser feito.
Como posso inserir o código corretamente? Ou apenas copiar e colar? Estou vendo a função Alt+S, mas não sei como ela funciona.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Regras gerais e melhores práticas do Fórum.
Alain Verleyen, 2017.07.19 11:03
Quando você postar o código, use o botão SRC!
#include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> CPositionInfo m_position; // objeto de posição comercial CTrade m_trade; // objeto de negociação CSymbolInfo m_symbol; // objeto de informação de símbolo CAccountInfo m_account; // wrapper de informações da conta //--- parâmetros de entrada input ENUM_TIMEFRAMES per_kis = PERIOD_M15; input ENUM_TIMEFRAMES per_nagy = PERIOD_H1; input int kis_trend_gyors_per= 99; input int kis_trend_lassú_per= 99; input int nagy_trend_gyors_per= 99; input int nagy_trend_lassú_per= 99; input ENUM_MA_METHOD MA_method_kis = MODE_SMA; input ENUM_MA_METHOD MA_method_nagy = MODE_SMA; input int ST_indikátor_periódus = 14; input int RSI_indikátor_periódus = 14; input int STh_alsó = 20; input int ST_lassuló = 3; input ushort TakeProfit=11111; input ushort StopLoss=90; input ushort TrailingStop=20; input double Lots=0.1; ulong m_magic=1; // número mágico ulong m_slippage=30; // derrapagem int handle_iMA_kis_trend_gyors; // variável para armazenar o identificador do indicador iMA int handle_iMA_kis_trend_lassú; int handle_iMA_nagy_trend_gyors; int handle_iMA_nagy_trend_lassú; int handle_iRSI; int handle_iStochastic_M15; // variável para armazenar o identificador do indicador iStochastic ENUM_ACCOUNT_MARGIN_MODE m_margin_mode; double m_adjusted_point; // valor do ponto ajustado para 3 ou 5 pontos //+------------------------------------------------------------------+ //| Função de inicialização de especialista| //+------------------------------------------------------------------+ int OnInit() { SetMarginMode(); if(!IsHedging()) { Print("Hedging only!"); return(INIT_FAILED); } if(TrailingStop>=TakeProfit) { Print("Error! TrailingStop>=TakeProfit!"); return(INIT_PARAMETERS_INCORRECT); } //--- m_symbol.Name(Symbol()); // define o nome do símbolo if(!RefreshRates()) { Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()), ", Ask=",DoubleToString(m_symbol.Ask(),Digits())); return(INIT_FAILED); } m_symbol.Refresh(); //--- m_trade.SetExpertMagicNumber(m_magic); //--- m_trade.SetDeviationInPoints(m_slippage); //--- sintonia para 3 ou 5 dígitos int digits_adjust=1; m_adjusted_point=m_symbol.Point()*digits_adjust; //--- criar identificador do indicador iMA handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0, MA_method_kis,PRICE_CLOSE); //--- criar identificador do indicador iMA handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per ,0,MA_method_kis , PRICE_CLOSE ); //--- criar identificador do indicador iMA handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per ,0, MA_method_nagy , PRICE_CLOSE ); //--- criar identificador do indicador iMA handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per ,0, MA_method_nagy , PRICE_CLOSE ); //--- criar identificador do indicador iRSI handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus, PRICE_CLOSE); //--- criar identificador do indicador iStochastic handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Função de desinicialização de especialista| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { if(kis_trend_gyors_per>=kis_trend_lassú_per || nagy_trend_gyors_per>=nagy_trend_lassú_per) return; static datetime PrevBars=0; datetime time_0=iTime(0); if(time_0==PrevBars) return; PrevBars=time_0; //--- вычисляем начальные параметры индикаторов для поиска условий входа double MA_kis_trend_gyors = iMAGet(handle_iMA_kis_trend_gyors,0); double MA_kis_trend_lassú = iMAGet(handle_iMA_kis_trend_lassú,0); double MA_nagy_trend_gyors = iMAGet(handle_iMA_nagy_trend_gyors,0); double MA_nagy_trend_lassú = iMAGet(handle_iMA_nagy_trend_lassú,0); double Stoh_fast = iStochasticGet(MAIN_LINE,0); double Stoh_fast_prew=iStochasticGet(MAIN_LINE,1); double RSI0 = iRSIGet(0); double RSI1 = iRSIGet(1); double StRSI=(Stoh_fast*RSI0)/100;//------------------------------------------------------------------------ I would like to draw out these outcomes. double StRSI_prew=(Stoh_fast_prew*RSI1)/100;//-------------------------------------------------------------- double price_M15=iClose(1,NULL,per_kis); bool Long=false; if(MA_kis_trend_gyors>MA_kis_trend_lassú && MA_nagy_trend_gyors>MA_nagy_trend_lassú) Long=true; if(!Long ) return; //--- проверка условий для совершения сделки if(Long==true ) { if( StRSI>STh_alsó && StRSI_prew<=STh_alsó ) { if(!RefreshRates()) return; //--- verificar o volume antes do OrderSend para evitar o erro "not enough money" (CTrade) double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),Lots,m_symbol.Ask(),ORDER_TYPE_BUY); if(chek_volime_lot!=0.0) if(chek_volime_lot>=Lots) { Print("COMPRAR разница (MA_M15-price_M15) = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()), " MA_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits()), " price_M15 = ",DoubleToString(MA_kis_trend_gyors,m_symbol.Digits())); double sl=m_symbol.NormalizePrice(m_symbol.Bid()-StopLoss*m_adjusted_point); double tp=m_symbol.NormalizePrice(m_symbol.Bid()+TakeProfit*m_adjusted_point); if(m_trade.Buy(Lots,NULL,m_symbol.Ask(),sl,tp)) { if(m_trade.ResultDeal()==0) Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); else Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } else Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } //--- трейлинг if(TrailingStop==0) return; for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // seleciona a posição por índice para acesso posterior às suas propriedades if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if(!RefreshRates()) continue; if(m_symbol.Bid()-m_position.PriceOpen()>TrailingStop*m_adjusted_point) { if(m_position.StopLoss()<m_symbol.Bid()-TrailingStop*m_adjusted_point) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_symbol.Bid()-TrailingStop*m_adjusted_point), m_position.TakeProfit())) Print("PositionModify -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } } //--- return; } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void SetMarginMode(void) { m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ bool IsHedging(void) { return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING); } //+------------------------------------------------------------------+ //| Atualiza os dados das cotações do símbolo| //+------------------------------------------------------------------+ bool RefreshRates() { //--- taxas de atualização if(!m_symbol.RefreshRates()) return(false); //--- proteção contra o valor de retorno "zero" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Obter o valor dos buffers para o iMA| //+------------------------------------------------------------------+ double iMAGet(int handle_iMA,const int index) { double MA[1]; //--- redefinir o código de erro ResetLastError(); //--- preencher uma parte da matriz iMABuffer com valores do buffer do indicador que tem índice 0 if(CopyBuffer(handle_iMA,0,index,1,MA)<0) { //--- se a cópia falhar, informe o código de erro PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError()); //--- sair com resultado zero - isso significa que o indicador é considerado como não calculado return(0.0); } return(MA[0]); } //+------------------------------------------------------------------+ //| Obter o valor dos buffers para o iStochastic //| os números do buffer são os seguintes:| //| 0 - MAIN_LINE, 1 - SIGNAL_LINE| //+------------------------------------------------------------------+ double iStochasticGet(const int buffer,const int index) { double Stochastic[1]; //--- redefinir o código de erro ResetLastError(); //--- Preencher uma parte da matriz iStochasticBuffer com valores do buffer do indicador que tem índice 0 if(CopyBuffer(handle_iStochastic_M15,buffer,index,1,Stochastic)<0) { //--- se a cópia falhar, informe o código de erro PrintFormat("Failed to copy data from the iStochastic indicator, error code %d",GetLastError()); //--- sair com resultado zero - isso significa que o indicador é considerado como não calculado return(0.0); } return(Stochastic[0]); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Obter o valor dos buffers para o iRSI| //+------------------------------------------------------------------+ double iRSIGet(const int index) { double RSI[1]; //--- redefinir o código de erro ResetLastError(); //--- preencher uma parte da matriz iRSI com valores do buffer do indicador que tem índice 0 if(CopyBuffer(handle_iRSI,0,index,1,RSI)<0) { //--- se a cópia falhar, informe o código de erro PrintFormat("Failed to copy data from the iRSI indicator, error code %d",GetLastError()); //--- sair com resultado zero - isso significa que o indicador é considerado como não calculado return(0.0); } return(RSI[0]); } //+------------------------------------------------------------------+ //| Obter fechamento para o índice de barra especificado| //+------------------------------------------------------------------+ double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=per_kis; double Close[1]; double close=0; int copied=CopyClose(symbol,timeframe,index,1,Close); if(copied>0) close=Close[0]; return(close); } //+------------------------------------------------------------------+ //| Obter o tempo para o índice de barra especificado| //+------------------------------------------------------------------+ datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=per_kis; datetime Time[1]; datetime time=0; int copied=CopyTime(symbol,timeframe,index,1,Time); if(copied>0) time=Time[0]; return(time); } //+------------------------------------------------------------------+
Combinando Polish Layer e Get Trend. Destaquei o problema com um plano de fundo em branco.
//--- criar identificador do indicador iMA handle_iMA_kis_trend_gyors=iMA(m_symbol.Name(),per_kis,kis_trend_gyors_per,0,MA_method_kis,PRICE_CLOSE); //--- se o identificador não for criado if(handle_iMA_kis_trend_gyors==INVALID_HANDLE) { //--- informar sobre a falha e emitir o código de erro PrintFormat("Failed to create handle \"handle_iMA_kis_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- o indicador é interrompido antecipadamente return(INIT_FAILED); } //--- criar identificador do indicador iMA handle_iMA_kis_trend_lassú=iMA(m_symbol.Name(),per_kis,kis_trend_lassú_per,0,MA_method_kis,PRICE_CLOSE); //--- se o identificador não for criado if(handle_iMA_kis_trend_lassú==INVALID_HANDLE) { //--- informar sobre a falha e emitir o código de erro PrintFormat("Falha ao criar o identificador \"handle_iMA_kis_trend_lassú\" do indicador iMA para o símbolo %s/%s, código de erro %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- o indicador é interrompido antecipadamente return(INIT_FAILED); } //--- criar identificador do indicador iMA handle_iMA_nagy_trend_gyors=iMA(m_symbol.Name(),per_nagy,nagy_trend_gyors_per,0,MA_method_nagy,PRICE_CLOSE); //--- se o identificador não for criado if(handle_iMA_nagy_trend_gyors==INVALID_HANDLE) { //--- informar sobre a falha e emitir o código de erro PrintFormat("Failed to create handle \"handle_iMA_nagy_trend_gyors\" of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- o indicador é interrompido antecipadamente return(INIT_FAILED); } //--- criar identificador do indicador iMA handle_iMA_nagy_trend_lassú=iMA(m_symbol.Name(),per_nagy,nagy_trend_lassú_per,0,MA_method_nagy,PRICE_CLOSE); //--- se o identificador não for criado if(handle_iMA_nagy_trend_lassú==INVALID_HANDLE) { //--- informar sobre a falha e emitir o código de erro PrintFormat("Falha ao criar o identificador \"handle_iMA_nagy_trend_lassú\" do indicador iMA para o símbolo %s/%s, código de erro %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- o indicador é interrompido antecipadamente return(INIT_FAILED); } //--- criar identificador do indicador iRSI handle_iRSI=iRSI(m_symbol.Name(),per_kis,RSI_indikátor_periódus,PRICE_CLOSE); //--- se o identificador não for criado if(handle_iRSI==INVALID_HANDLE) { //--- informar sobre a falha e emitir o código de erro PrintFormat("Failed to create handle \"handle_iRSI\" of the iRSI indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- o indicador é interrompido antecipadamente return(INIT_FAILED); } //--- criar identificador do indicador iStochastic handle_iStochastic_M15=iStochastic(m_symbol.Name(),per_kis,ST_indikátor_periódus,3,ST_lassuló,MODE_SMA,STO_CLOSECLOSE); //--- se o identificador não for criado if(handle_iStochastic_M15==INVALID_HANDLE) { //--- informar sobre a falha e emitir o código de erro PrintFormat("Failed to create handle \"handle_iStochastic_M15\" of the iStochastic indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(per_kis), GetLastError()); //--- o indicador é interrompido antecipadamente return(INIT_FAILED); }
//--- Eu gostaria de destacar esses resultados. double StRSI=(Stoh_fast*RSI0)/100.0; double StRSI_prew=(Stoh_fast_prew*RSI1)/100.0; //---
Gostaria de extrair o resultado do Estocástico multiplicado pelo RSI.
Não estou entendendo.
Tente explicar em outras palavras ou faça um desenho.
- 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
Polish Layer:
Este Expert Advisor baseia-se nos indicadores: RSI, WPR, Stochastic, Moving Average, deMarker.
Autor: Vladimir Karputov