[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 767

 
FoxUA:

Sim, parte do código funciona e parte do código diz erro 4107 e 130 e o mais interessante é que eles pegam o preço de uma e a mesma função e trabalham em uma e a mesma função de abertura.


Tente a seguinte estrutura em algum lugar, este exemplo é para o meu caso .

if (OrderSend(Symbol(),OP_BUYSTOP,Lot,OpenPrice,0,Ask,0,0,Mg,0,Red)== -1)
Print("Error 1 OP_BUYSTOP "," Open=",OpenPrice," Stop Loss=",Ask," Trall=",TrallBuy," StopLoss=",StopLoss=",StopLoss) ;

veja o resultado no log em

 

Boa tarde, conhecedores. Ajude-me a entender este código...

//+------------------------------------------------------------------+
//| Calcular posições abertas |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(símbolo de corda)
{
int compra=0,vende=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==falso) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICEA)
{
if(OrderType()==OP_BUY) compra++;
if(OrderType()==OP_SELL) vende++;
}
}
//---- volume de pedidos de devolução
if(compra>0) return(compra);
senão devolve(-sells);
}

//+------------------------------------------------------------------+
//| Calcular o tamanho ideal do lote |
//+------------------------------------------------------------------+
tamanho de lote duplo(){
lote duploMM;
if(PairsTraded==0){
lotMM = MathCeil(AccountFreeMargin() * Risco / 10000) / 10;
{} else {
loteMM = MathCeil(AccountFreeMargin() * Risco / 10000 /PairsTraded) / 10 ;
}
se (MM===verdadeiro){
se (loteMM < 0,1) loteMM = Lotes;
se (loteMM > 1,0) loteMM = MathCeil(loteMM);
se (loteMM > 100) loteMM = MaxLots;
}
outro loteMM = Muito;
retorno (loteMM);
}

//+------------------------------------------------------------------+
//| Verifique as condições de pedidos em aberto |
//+------------------------------------------------------------------+
CheckForOpen()
{
duplo CCI5,CCI15,CCI30,CCIH1,CCIH4;
int enviar;

//----MultitimeFrame CCI setting


CCI5 = iCCI(NULL,PERÍODO_M5,50,PREÇO_CLOSE,0);
CCI15 = iCCI(NULL,PERÍODO_M15,50,PREÇO_CLOSE,0);
CCI30 = iCCI(NULL,PERÍODO_M30,50,PREÇO_CLOSE,0);
CCIH1 = iCCI(NULL,PERÍODO_H1,50,PREÇO_CLOSE,0);


//----


//---- condições de venda
se ((CCIH1<0)&&(CCI30<0)&&(CCI15<0)&&(CCI5<0))//op vender
{
send=OrderSend(Symbol(),OP_SELLL,LotSize(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,MagicName+"-Sell",MAGICEA,0,Red);
retornar;
}

//---- condições de compra
se ((CCIH1>0)&&(CCI30>0)&&(CCI15>0)&&(CCI5>0))//op comprar
{
send=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,MagicName+"-Buy",MAGICEA,0,Blue);
retornar;
}
}

//----

//+------------------------------------------------------------------+
//| Verifique as condições de fechamento do pedido |
//+------------------------------------------------------------------+
verificação nula CheckForClose()
{
//----


//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==falso) break;
if(OrderMagicNumber()!=MAGICEA || OrderSymbol()!=Symbol()) continua;

//---- check order type
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-TrailingStop*Point > OrderStopLoss()){

if (Bid > OrderOpenPrice()+TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,0,0,White);
}
{} else {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-1*Point,0,0,White);
}
if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && Ask-TrailingStop*Point < OrderStopLoss()){

se (Pergunte < OrderOpenPrice()-TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,0,0,White);
}
{} else {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+1*Point,0,0,White);
}
}

//----
}
//+------------------------------------------------------------------+
//| Função Start |
//+------------------------------------------------------------------+
início nulo()
{
//---- verificação de histórico e comércio
if(Bars<100 || IsTradeAllowed()==falso) retorna;

//---- calcular pedidos em aberto pelo símbolo atual
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
senão CheckForClose();

//----
}
//+------------------------------------------------------------------+

Se eu quero que ele abra apenas uma posição e não quero que ele abra novamente depois de fechá-lo, mas ele abre uma posição depois de fechá-lo, eu quero que ele abra novamente.

 
mydone:

Boa tarde, conhecedores. Ajude-me a entender este código...

... código ...

Não entendo o que fiz de errado. Preciso que ela abra apenas uma transação sob condição formada e após seu fechamento até a próxima condição não abra mais... mas o que eu tenho é que ela abre, eu fecho, por exemplo, uma determinada transação e ela abre novamente no mesmo lugar para quê?

Você a tem e ela se abrirá enquanto a condição de abertura existir.

Verifique se a posição já foi aberta por este sinal, por exemplo, bool OpnPose = falso; antes de abrir uma posição por este sinal, verifique a bandeira e, se ela não estiver definida (OpnPose == falso), abra a posição. Quando ela se abre, se ela realmente se abriu e está no mercado, você coloca a bandeira para abrir por este sinal: OpnPose = verdadeiro; assim que um novo sinal chega, você descarta este:
OpnPose = falso;

 
Sim, podemos tornar mais simples, depois que o sinal for acionado coloque um contador para que nada mais se abra dentro de 2 ou 3 velas, para que se fechar manualmente nada mais se abra, e o contador cancele a proibição de abertura após um par de velas
 

Obrigado

 
Techno:
Sim, podemos tornar mais simples, depois que o sinal for acionado coloque um contador para que nada mais se abra dentro de 2 ou 3 velas, para que se fechar manualmente nada mais se abra, e o contador cancele a proibição de abertura após um par de velas
E depois que a proibição for levantada, a EA colocará novamente uma ordem no mercado. E se a EA decidir fechar a posição após 10, 15 ou 20 castiçais e não abrir novamente, mesmo que o sinal ainda esteja presente? Na sexta-feira, por exemplo...
 
artmedia70:
E depois que a proibição for levantada, a EA colocará a ordem de volta no mercado. E se ele decidir fechar a posição após 10, 15, 20 velas e não abrir novamente, mesmo que o sinal ainda esteja lá? Na sexta-feira, por exemplo...
Mesmo após uma vela, haverá um sinal completamente diferente que deve ser levado em conta. Basta esperar por 3 castiçais para que o primeiro sinal desapareça. A propósito, você usa um indicador com tempo de 5, 15, 30 e 60, portanto, 3 castiçais de 30 ou 15 minutos serão suficientes.
 

minha pergunta é como fazer se existe uma nova ordem a partir do exemplo exatamente oposto se existe uma ordem fechada "se(TotalHistoryOrders<OrdersHistoryTotal())// outra ordem apareceu na história" e eu preciso que a ordem aberta também seja determinada

 
FoxUA:

minha pergunta é como fazer se existe uma nova ordem a partir do exemplo exatamente oposto se existe uma ordem fechada "se(TotalHistoryOrders<OrdersHistoryTotal())// outra ordem apareceu na história" e eu preciso que a ordem aberta também seja determinada

Ao passar por todas as ordens e peneirar as desnecessárias, conte o número e salve-o. Se o número mudar com um novo loop, significa que ou uma nova ordem foi aberta ou desapareceu...
 
Techno:
Ao passar por todas as ordens e peneirar as desnecessárias, conte o número, lembre-se dele e se com um novo ciclo o número mudou, significa que ou uma nova ordem apareceu ou desapareceu.


Eu só preciso chamar a função e pronto, só preciso de uma linha "Se as ordens são mais de uma do que .... é tudo" e você me oferece uma função completa

É assim que eu armazeno dados sobre os pedidos

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic