Versão 1.105: Introduziu funções separadas OpenBuy e OpenSell
//| Abertura da posição de compra por símbolo|
//+------------------------------------------------------------------+
bool OpenBuy(const double lot)
{
bool res=false;
double price=m_symbol.Ask();
double tp=m_symbol.NormalizePrice(m_symbol.Bid()+InpTP*m_adjusted_point);
if(m_trade.Buy(lot,m_symbol.Name(),price,0.0,tp))
if(m_trade.ResultDeal()>0)
res=true;
return(res);
}
//+------------------------------------------------------------------+
//| Abertura de uma posição de VENDA por símbolo|
//+------------------------------------------------------------------+
bool OpenSell(const double lot)
{
bool res=false;
double price=m_symbol.Bid();
double tp=m_symbol.NormalizePrice(m_symbol.Ask()-InpTP*m_adjusted_point);
if(m_trade.Sell(lot,m_symbol.Name(),price,0.0,tp))
if(m_trade.ResultDeal()>0)
res=true;
return(res);
}
Agora o código está mais legível.
Como sempre, o problema é o que fazer com as posições não lucrativas que estão penduradas? Aqui está um exemplo da versão 1.105:

A versão 1.105 e a versão 1.105 com uma pequena alteração: em OnTradeTransaction (quando um fechamento de posição TakeProfit é detectado), procuramos a posição mais não lucrativa e fechamos essa posição mais não lucrativa:

Deixe-me lembrá-lo de que os testes individuais são realizados exclusivamente no modo"Every Tick Based on Real Tick".
Ambas as variantes começaram em 10000. Qual variante escolher - acho que isso depende de seus objetivos específicos.
há uma opção para fechar todas as posições quando pelo menos uma delas recebe um tp
Nesse caso, pode ser assim:
o primeiro início - duas posições multidirecionais, uma delas recebe TakeProfit e fechamos todas elas (ou seja, fechamos a posição restante - a não lucrativa). Como resultado, obtemos lucro no TakeProfit e, ao mesmo tempo, uma perda na segunda posição.
Isso não parece muito bom.
Nesse caso, pode ser assim:
primeiro início - duas posições multidirecionais, uma obtém TakeProfit e fechamos todas elas (ou seja, fechamos a posição restante - a não lucrativa). Como resultado, obtemos lucro no TakeProfit e, ao mesmo tempo, uma perda na segunda posição.
Isso não é muito bom.
Eu tenho um desses, mas deveria haver no mínimo 2 + entrada bem-sucedida.
O principal problema é encontrar uma entrada em que a soma das entradas bem-sucedidas seja mais da metade da soma das malsucedidas.
8 joelhos a partir de 0,01 é suficiente se não for um cruzamento.
teoria
1) 2 ordens de 0,01 cada são abertas em direções diferentes no sinal
2) se o preço ultrapassar a distância necessária para o lucro, então uma recarga com um take profit o número de recargas, o passo do joelho e o take profit - você pode brincar com isso por um longo tempo.
Decidi deixar a segunda opção (... com uma pequena alteração: em OnTradeTransaction (quando o fechamento de uma posição por TakeProfit é detectado), procuramos a posição mais não lucrativa e fechamos essa posição mais não lucrativa...):
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Vladimir Karputov, 2017.01.22 19:00
Como sempre, o problema - o que fazer com as posições não lucrativas que estão penduradas? Aqui está um exemplo da versão 1.105:

e a versão 1.105 com uma pequena alteração: em OnTradeTransaction (quando o fechamento da posição TakeProfit é detectado), procuramos a posição mais não lucrativa e fechamos essa posição mais não lucrativa:

Deixe-me lembrá-lo de que os testes individuais são realizados exclusivamente no modo"Every Tick Based on Real Tick".
Ambas as variantes começaram em 10000. Qual variante escolher - acho que isso depende de seus objetivos específicos.
agora versão 1.106
Versão 1.007 - proteção contra reinicialização do terminal:
if(!RefreshRates())
return;
if(m_first)
{
//--- proteção contra reinicialização do terminal:
int total=0;
for(int i=PositionsTotal()-1;i>=0;i--) // retorna o número de posições abertas
if(m_position.SelectByIndex(i)) // seleciona a posição por índice para acesso posterior às suas propriedades
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
total++;
//--- se já houver posições abertas por esse Expert Advisor na conta de negociação
//--- Então, inicializamos as variáveis de forma que pareça que já foi a primeira vez.
if(total>0)
{
bln_buy=true;
bln_sell=true;
m_first=false;
return;
}
if(OpenBuy(InpLot))
bln_buy=true;
if(OpenSell(InpLot))
bln_sell=true;
m_first=false;
}
//---
Agora, se o terminal tiver sido reiniciado ou o EA tiver sido recompilado e o EA já tiver aberto posições na conta de negociação fornecida, não haverá situação de "primeira execução".
Versão 1.108 Agora, no crossover e no TakeProfit, se houver uma posição lucrativa, ela também será fechada.
Compare a versão 1.108 (gráficos superiores) com a versão anterior 1.107:
и
A versão 1.108 tem um lucro total menor, mas também os rebaixamentos em períodos difíceis são duas vezes menores em comparação com a versão 1.107.
- 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


New Martin:
New Martin - Expert Advisor que, no início, abre duas posições opostas. Processamento OnTradeTransaction. Assim que o Take Profit se executar, ele abrirá (UMA) posição na mesma direção. A interseção de dois indicadores MA é um sinal para abertura da posição com um lote maior.
Autor: Vladimir Karputov