[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 767

 
FoxUA:

Sì, parte del codice funziona e parte del codice dice 4107 e 130 di errore e la cosa più interessante è che prendono il prezzo da una stessa funzione e lavorano su una stessa funzione di apertura.


Provate la seguente struttura da qualche parte, questo esempio è per il mio caso.

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

vedere il risultato nel log all'indirizzo

 

Buon pomeriggio intenditori. Aiutami a capire questo codice...

//+------------------------------------------------------------------+
//| Calcolare le posizioni aperte
//+------------------------------------------------------------------+
int CalcolaOrdiniCorrenti(simbolo stringa)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICEA)
{
se(OrderType()==OP_BUY) compra++;
se(OrderType()==OP_SELL) vende++;
}
}
//---- volume degli ordini di ritorno
if(buys>0) return(buys);
else return(-sells);
}

//+------------------------------------------------------------------+
//| Calcolare la dimensione ottimale del lotto
//+------------------------------------------------------------------+
doppio LotSize(){
doppio lottoMM;
if(PairsTraded==0){
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000) / 10;
} else {
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000 /PairsTraded) / 10 ;
}
se (MM==true){
se (lotMM < 0,1) lotMM = Lotti;
se (lotMM > 1,0) lotMM = MathCeil(lotMM);
se (lotMM > 100) lotMM = MaxLots;
}
else lotMM = Lotti;
ritorno (lotMM);
}

//+------------------------------------------------------------------+
//controllare le condizioni di ordine aperto
//+------------------------------------------------------------------+
void CheckForOpen()
{
doppio CCI5, CCI15, CCI30, CCIH1, CCIH4;
int inviare;

//----MultitimeFrame impostazione CCI


CCI5 = iCCI(NULL,PERIOD_M5,50,PRICE_CLOSE,0);
CCI15 = iCCI(NULL,PERIOD_M15,50,PRICE_CLOSE,0);
CCI30 = iCCI(NULL,PERIOD_M30,50,PRICE_CLOSE,0);
CCIH1 = iCCI(NULL,PERIOD_H1,50,PRICE_CLOSE,0);


//----


//---- condizioni di vendita
se ((CCIH1<0)&&(CCI30<0)&&(CCI15<0)&&(CCI5<0))//op sell
{
send=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,MagicName+"-Sell",MAGICEA,0,Red);
ritorno;
}

//---- condizioni di acquisto
se ((CCIH1>0)&&(CCI30>0)&&(CCI15>0)&&(CCI5>0))//op buy
{
send=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,MagicName+"-Buy",MAGICEA,0,Blue);
ritorno;
}
}

//----

//+------------------------------------------------------------------+
//| Controlla le condizioni di chiusura dell'ordine
//+------------------------------------------------------------------+
void CheckForClose()
{
//----


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

//---- controllare il tipo di ordine
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-TrailingStop*Point > OrderStopLoss()){

se (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 (Ask < OrderOpenPrice()-TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,0,0,White);
}
} else {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+1*Point,0,0,White);
}
}

//----
}
//+------------------------------------------------------------------+
//| Iniziare la funzione |
//+------------------------------------------------------------------+
void start()
{
//---- controllare la storia e il commercio
if(Bars<100 || IsTradeAllowed()==false) return;

//---- calcolare gli ordini aperti in base al simbolo corrente
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();

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

Se voglio che apra solo una posizione e non voglio che si apra di nuovo dopo averla chiusa, ma apre una posizione dopo averla chiusa, si apre di nuovo.

 
mydone:

Buon pomeriggio intenditori. Aiutami a capire questo codice...

... codice ...

Ho bisogno che apra solo una transazione sotto condizione formata e dopo la sua chiusura fino alla prossima condizione non ne apra più... ma quello che ho è che si apre, chiudo per esempio una finestra e si apre di nuovo nello stesso posto per cosa?

Ce l'avete e si aprirà finché esisterà la condizione di apertura.

Fare un controllo che la posizione sia già stata aperta da questo segnale, ad esempio, bool OpnPose = false; prima di aprire una posizione da questo segnale, controllare il flag e se non è impostato (OpnPose == false), aprire la posizione. Quando si apre, se ha veramente aperto ed è sul mercato, si imposta la bandiera di apertura con questo segnale: OpnPose = true; appena arriva un nuovo segnale, si scarta questo:
OpnPose = false;

 
Sì, possiamo renderlo più semplice, dopo l'attivazione del segnale mettere un contatore in modo che non si apra nient'altro entro 2 o 3 candele, in modo che se si chiude manualmente non si apre nient'altro, e il contatore annulla il divieto di apertura dopo un paio di candele
 

Grazie

 
Techno:
Sì, possiamo renderlo più semplice, dopo l'attivazione del segnale mettere un contatore in modo che non si apra nient'altro entro 2 o 3 candele, in modo che se si chiude manualmente non si apre nient'altro, e il contatore annulla il divieto di apertura dopo un paio di candele
E dopo che il divieto è revocato, l'EA piazzerà di nuovo un ordine sul mercato... Cosa succede se l'EA decide di chiudere la posizione dopo 10, 15 o 20 candele e non apre di nuovo, anche se il segnale è ancora presente? Venerdì, per esempio...
 
artmedia70:
E dopo che il divieto è revocato, l'EA rimetterà l'ordine sul mercato... E se decide di chiudere la posizione dopo 10, 15, 20 candele e non aprirla di nuovo, anche se il segnale è ancora lì? Venerdì, per esempio...
Anche dopo una candela ci sarà un segnale completamente diverso che deve essere preso in considerazione. È sufficiente aspettare 3 candele perché il primo segnale scompaia. A proposito, si usa un indicatore con tempo di 5, 15, 30 e 60, quindi 3 candele da 30 o 15 minuti saranno sufficienti.
 

la mia domanda è come fare se c'è un nuovo ordine dall'esempio dell'esatto contrario se c'è un ordine chiuso "if(TotalHistoryOrders<OrdersHistoryTotal())// un altro ordine è apparso nella storia" e ho bisogno che anche quello aperto sia determinato

 
FoxUA:

la mia domanda è come fare se c'è un nuovo ordine dall'esempio dell'esatto contrario se c'è un ordine chiuso "if(TotalHistoryOrders<OrdersHistoryTotal())// un altro ordine è apparso nella storia" e ho bisogno che anche quello aperto sia determinato

Quando passi in rassegna tutti gli ordini ed elimini quelli inutili, conta il numero e salvalo. Se il numero cambia con un nuovo ciclo, significa che o si è aperto un nuovo ordine o è scomparso...
 
Techno:
Quando provate tutti gli ordini e passate al setaccio quelli inutili, contate il numero, ricordatelo e se il numero è cambiato con un nuovo ciclo, significa che un nuovo ordine è apparso o è scomparso.


Ho solo bisogno di chiamare la funzione ed è tutto, ho solo bisogno di una linea "Se gli ordini sono più di uno che .... questo è tutto" e tu mi offri un'intera funzione

Questo è il modo in cui memorizzo i dati degli ordini

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