Continuando a escrever mais um porquinho no martingale, perdendo até mesmo no testador, caso contrário, como é suposto cultivarmos um alce.
No momento há um parâmetro desejado, que deve ser responsável pela possibilidade de abrir o próximo pedido após o(s) pedido(s) anterior(es) ser(em) fechado(s)
Por favor, informe. O Expert Advisor não abre ordens no terminal. A compilação está em andamento, de acordo com os gráficos as ordens devem ser abertas. Mas não são. Estou anexando o código.
double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//determinar o número de lotes double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//MACD parameters of the current bar double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);// os parâmetros MACD da barra anterior double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);// os parâmetros MACD da linha principal compensados por 2 barras stopLoss duplo=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Parâmetros de Parâmetros de Parâmetros de Parâmetros ParabolicSAR da barra atual double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//StopLoss parameters by ParabolicSAR parameters of the previous bar duplo PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//parameters ParabolicSAR da barra atual duplo PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Parâmetros do PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//ParabolicSAR parâmetros da barra anterior //+------------------------------------------------------------------+ //| Função de carrapato de especialista| //+------------------------------------------------------------------+ nulo OnTick() { data/hora estática New_Time=TimeCurrent();// Hora da barra atual bool New_Bar=false; // Bandeira nova barra int ticket,total,cnt; //--------------------------------------------------------------------------- { New_Bar=false; // Nenhuma barra nova if(Time[0]==Novo_Tempo) // Comparar tempos { New_Bar=true; // New_Bar is caught if(New_Bar==false) // Se uma barra não for nova voltar; // ...depois sair } } total=OrdensTotal();// Determinação do número de pedidos if(total<1) { //... sem ordens em aberto if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT)) //Cheque a disponibilidade de fundos para abrir o lote mínimo { Imprimir("Não há fundos suficientes. Fundos livres = ",AccountFreeMargin())); retornar; }
//---condição para abertura de posição longa (BUY) if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0) && PSARCurrent<iOpen(NULL,0,1)) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,0,NULL,MAGICNUMBER,0,Green); if(ticket>0)//check position opened { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("COMPRAR pedido aberto : ",OrderOpenPrice()); senão Print("BUY order open error : ",GetLastError())); retornar; } }
//... condição para abrir uma posição curta (SELL) if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0) && PSARCurrent>iOpen(NULL,0,1)) { ticket=OrderSend(Symbol(),OP_SELLL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red); if(ticket>0)//check position opened { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("VENDER pedido aberto : ",OrderOpenPrice()); senão Imprimir("Erro abrindo pedido de VENDA : ",GetLastError())); retornar; } } //--- sair do bloco "sem ordens abertas
} //--- é importante entrar no mercado corretamente, mas é mais importante sair dele corretamente for(cnt=0;cnt<total;cnt++) { if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MAGICNUMBER && // verifique o número mágico do pedido OrderSymbol()==Symbol()) // verificar o símbolo do pedido { //--- posição longa aberta if(OrderType()==OP_BUY) { //--- deve ser fechado? if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0) && PSARCurrent>iOpen(NULL,0,1)) { //--- Encomende o fechamento e a saída if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Imprimir("OrderClose error ",GetLastError()); retornar; } //------------------Modificar a ordem por StopLoss if(StopLoss>Previous_StopLoss &&StopLoss<iOpen(NULL,0,0)) if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue)) Imprimir("Erro de modificação de pedido. Código de erro=",GetLastError())); senão Imprimir("Stop Loss price of the order has been modified successfully;) retornar; } }
senão // ir abreviado if(OrderType()==OP_SELL) { //--- deve ser fechado? if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0) && PSARCurrent<iOpen(NULL,0,1)) { //--- Encomende o fechamento e a saída if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Imprimir("OrderClose error ",GetLastError()); retornar; } //-----------------Modificar a ordem por StopLoss if(StopLoss<Previous_StopLoss &&StopLoss>iOpen(NULL,0,0)) if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue)) Imprimir("Erro de modificação de pedido. Código de erro=",GetLastError())); senão Imprimir("Stop Loss price of the order has been modified successfully;) retornar; } } }
Dratuti. Como você faz um painel como este?
Dratuti. Como você faz um painel como este?
Dratuti. Como você faz um painel como este?
Vitaly Muzichenko,Artyom Trishkin agradece a você.
Continuando a escrever mais um porquinho no martingale, perdendo até mesmo no testador, caso contrário, como é suposto cultivarmos um alce.
No momento há um parâmetro desejado, que deve ser responsável pela possibilidade de abrir o próximo pedido após o(s) pedido(s) anterior(es) ser(em) fechado(s)
há 2 cenários
1) se o valor for verdadeiro
abrir um pedido
processo
fechar
e reabrir
2) se falso
Abra o pedido
Processo
Fechar
e depois fazer ExpertRemove
o problema é que estas duas condições são mutuamente exclusivas, mas têm de ser combinadas em 1 Expert Advisor, uma vez que
1) o valor é definido no início
2) o valor é estabelecido nas condições de entrada e processamento e aceito para processamento (se verdadeiro, aberto)
3) após o fechamento, definimos falso
Se alguém estiver interessado em tais coisas, eu ficaria feliz em ouvir minhas variantes.É simples:
Temos problemas com a lógica.
Tudo é simples:
Algo não parece certo, se for verdade - você deveria estar cortando couve, não nos arbustos)
Por favor, informe. O Expert Advisor não abre ordens no terminal. A compilação está em andamento, de acordo com os gráficos as ordens devem ser abertas. Mas não são. Estou anexando o código.
double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//determinar o número de lotes
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//MACD parameters of the current bar
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);// os parâmetros MACD da barra anterior
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);// os parâmetros MACD da linha principal compensados por 2 barras
stopLoss duplo=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Parâmetros de Parâmetros de Parâmetros de Parâmetros ParabolicSAR da barra atual
double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//StopLoss parameters by ParabolicSAR parameters of the previous bar
duplo PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//parameters ParabolicSAR da barra atual
duplo PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Parâmetros do PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//ParabolicSAR parâmetros da barra anterior
//+------------------------------------------------------------------+
//| Função de carrapato de especialista|
//+------------------------------------------------------------------+
nulo OnTick()
{
data/hora estática New_Time=TimeCurrent();// Hora da barra atual
bool New_Bar=false; // Bandeira nova barra
int ticket,total,cnt;
//---------------------------------------------------------------------------
{
New_Bar=false; // Nenhuma barra nova
if(Time[0]==Novo_Tempo) // Comparar tempos
{
New_Bar=true; // New_Bar is caught
if(New_Bar==false) // Se uma barra não for nova
voltar; // ...depois sair
}
}
total=OrdensTotal();// Determinação do número de pedidos
if(total<1)
{
//... sem ordens em aberto
if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
//Cheque a disponibilidade de fundos para abrir o lote mínimo
{
Imprimir("Não há fundos suficientes. Fundos livres = ",AccountFreeMargin()));
retornar;
}
//---condição para abertura de posição longa (BUY)
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//check position opened
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("COMPRAR pedido aberto : ",OrderOpenPrice());
senão
Print("BUY order open error : ",GetLastError()));
retornar;
}
}
//... condição para abrir uma posição curta (SELL)
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_SELLL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red);
if(ticket>0)//check position opened
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("VENDER pedido aberto : ",OrderOpenPrice());
senão
Imprimir("Erro abrindo pedido de VENDA : ",GetLastError()));
retornar;
}
}
//--- sair do bloco "sem ordens abertas
}
//--- é importante entrar no mercado corretamente, mas é mais importante sair dele corretamente
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MAGICNUMBER && // verifique o número mágico do pedido
OrderSymbol()==Symbol()) // verificar o símbolo do pedido
{
//--- posição longa aberta
if(OrderType()==OP_BUY)
{
//--- deve ser fechado?
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
//--- Encomende o fechamento e a saída
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Imprimir("OrderClose error ",GetLastError());
retornar;
}
//------------------Modificar a ordem por StopLoss
if(StopLoss>Previous_StopLoss &&StopLoss<iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Imprimir("Erro de modificação de pedido. Código de erro=",GetLastError()));
senão
Imprimir("Stop Loss price of the order has been modified successfully;)
retornar;
}
}
senão // ir abreviado
if(OrderType()==OP_SELL)
{
//--- deve ser fechado?
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
//--- Encomende o fechamento e a saída
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Imprimir("OrderClose error ",GetLastError());
retornar;
}
//-----------------Modificar a ordem por StopLoss
if(StopLoss<Previous_StopLoss &&StopLoss>iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Imprimir("Erro de modificação de pedido. Código de erro=",GetLastError()));
senão
Imprimir("Stop Loss price of the order has been modified successfully;)
retornar;
}
}
}
//-------------------------------------------------------------------------------------------------------
Sim, é mais simples do que isso.
mas e se mantivermos isso como um recuo e fizermos o seguinte
verificar a condição e...ou seja, como bloquear a entrada para operação posterior