[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 29

 

Ciao...

Ho scritto un EA ma mi sono imbattuto in questo problema:

Ho ordini opposti e per esempio per BUY ho 150 pips di stop e 150 pips di profitto, per SELL gli stessi livelli sono impostati, ma solo invertiti (cioè quello che è per buy profit, poi per sell stop), cioè in realtà devo chiudere tutto contemporaneamente, sia sell con buy che buy con sell..... ma c'è un'altra cosa, spread!))) E da questi due ordini opposti gli altri 8 sono già aperti (naturalmente se tutti gli otto sono necessari, le condizioni sono diverse per loro, sono anche opposti 4/4)


Come posso programmare correttamente il codice per chiudere tutti gli ordini quando raggiungono lo stesso prezzo simultaneamente? Per nel tester, quando provo, il prezzo a volte raggiunge un livello desiderato, per esempio, vendere chiuso (non raggiungendo un livello predeterminato, credo che sia uno spread) e comprare appeso e dopo poco tempo cade e comprare chiuso alla fermata, quindi non posso vedere il risultato corretto.


Vi sarei grato se poteste esprimere la vostra idea programmaticamente, cioè in codice.


Per capire meglio, vi do la parte in cui si aprono i miei due ordini opposti (primi).

if (by == FALSE) 
   {   g_ticket_112 = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 1, NormalizeDouble(Ask - SL * Point, Digits), 
       NormalizeDouble(Ask + TP * Point, Digits), "", 111, 0, Blue);
   if (g_ticket_112 > 0) by = TRUE;
   } 
     
     if (se == false) 
   {for (g_pos_116 = OrdersTotal() - 1; g_pos_116 >= 0; g_pos_116--) 
   {if (OrderSelect(g_pos_116, SELECT_BY_POS, MODE_TRADES)) 
   {if (OrderSymbol() != Symbol() || OrderMagicNumber() != 111) continue;
    if (se == false) 
   {g_ticket_113 = OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), 1, 
    OrderTakeProfit(),OrderStopLoss() , "", 222, 0, Blue);
    if (g_ticket_113 > 0) se = TRUE;}}}} 
 
Avete uno script che allunga il programma su tutti i fine settimana, cioè che il programma non si fonde con il lunedì, e sono rimasti giorni vuoti sabato e domenica.
 

Ciao a tutti.

La domanda è: avete una funzione che rileva l'apertura di una nuova barra(non importa quale timeframe), o, più precisamente, diverse varianti di trovare una nuova barra.

 
dmitriy086:

Ciao a tutti.

La domanda è: avete una funzione che rileva l'apertura di una nuova barra (non importa quale timeframe), o, più precisamente, possono diverse varianti (trailer) trovare una nuova barra.


Ricordare il tempo oldtime = Time[0] e confrontare il tempo ricordato if( oldtime !=Time[0])Print("Evviva una nuova barra!!!");

SZY: i trailer sono nella funzione iTime().

:)

 
//+------------------------------------------------------------------+
bool fNewBar()
  {
   static datetime NewTime=0;
   if(NewTime!=iTime (Symbol(),0,0))
    {
     if(NewTime==0)
      {
       NewTime=iTime (Symbol(),0,1);return(false);
      }      
     NewTime=iTime (Symbol(),0,0);
     return(true);
    }
   return(false);     
  }
//+----------------------------------------------------------------------------+

IgorM, il problema è che questo f-fi è su un grafico sintetico dove iTime[0] può essere uguale a iTime[1], quindi come possiamo liberarci del tempo in modo che l'Expert Advisor apra solo un trade su una nuova barra?
 
dmitriy086:
IgorM, il problema è che questo f-fi è su un grafico sintetico dove iTime[0] può essere uguale a iTime[1], quindi come possiamo eliminare il tempo in modo che l'EA apra solo un trade su una nuova barra?


se il tempo delle barre 0 e 1 non può essere abbinato per qualche motivo sconosciuto - il tipo datetime memorizza i dati in secondi, cambia il tempo della barra di almeno 1 secondo

poi cercate di ricordare tutte le caratteristiche della prima barra chiusa, cioè OHLC, volume e tempo aperto - se cambiate anche un solo parametro, significa una nuova barra

iBars() mostrerà il numero di barre nel timeframe corrente, e sarà limitato dalle impostazioni del terminale, si può provare a confrontare il numero di barre con il numero di barre memorizzato e al momento della comparsa di una nuova barra, questi valori sono diversi - ma non sempre, ha funzionato per me in questo modo, ma probabilmente a causa del numero di build MT4 questa opzione potrebbe non funzionare

 
Hai un pezzo di codice pronto, per caso? Non riesco a capire come ricordare OHLC[1] e confrontarlo con OHLC[0]...
 
dmitriy086:
Hai un pezzo di codice pronto, per caso? Non riesco a capire come memorizzare OHLC[1] e confrontarlo con OHLC[0]...


OHLC è un acronimo comune per Open,High,Low,Close

non si confronta con lo zero, ma il primo con quello memorizzato in precedenza, cioè

init(){

oldHigh = High[1];

///

}

start(){

doppio tmp = High[1];

if(tmp !=oldHigh) {oldHigh = tmp;

//controllare il resto dei parametri della barra

}

}

 

Grazie per la dritta, ci darò un'occhiata...

 

Si prega di consigliare come impostare il controllo corretto nella condizione di apertura della posizione - se c'è una posizione aperta per questo strumento o no. E se c'è una posizione per il simbolo (qualsiasi vendita o acquisto), allora l'apertura non avviene, altrimenti scatta il segnale di apertura della posizione?

Ecco il codice (credo che sia responsabile dell'apertura delle posizioni):

if (NumberOfPositions("" ,-1,Magic)>=2)  флаг1=1;//если число позиций >= 2
if (NumberOfPositions("" ,-1,Magic)<1 )  флаг1=0;//если нет откр. позиций
if ( TradeDOWN==true && флаг1==0) {//если условия соответствуют заданным  
//продаем 1-й символ и покупаем второй символ
//----------------------------------------
if (NumberOfPositions(Symbol_1,OP_SELL,Magic)<1){//если нет поз.селл и поз.бай по 1-му символу
 if (NumberOfPositions(Symbol_1,OP_BUY,Magic)<1)
 {
 SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_1>0)   SL=Bid_Tiker1+POINT_Tiker1*StopLoss_1;
if(TakeProfit_1>0) TP=Bid_Tiker1-POINT_Tiker1*TakeProfit_1; 
 ti=OpenPosition(Symbol_1, OP_SELL, Lots_1,0 ,0,Magic);
if(StopLoss_1>0 || TakeProfit_1>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET)) ModifyOrder(-1, SL, TP, clModifySell);}
                                   }}//если нет поз.селл и поз.бай по 1-му символу
//--------------------------------------
if (NumberOfPositions(Symbol_2,OP_BUY,Magic)<1){//если нет поз. бай и поз. селл по 2-му символу 
 if (NumberOfPositions(Symbol_2,OP_SELL,Magic)<1)
 {
   SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_2>0)   SL=Bid_Tiker2-POINT_Tiker2*StopLoss_2;
if(TakeProfit_2>0) TP=Ask_Tiker2+POINT_Tiker2*TakeProfit_2;   
ti=OpenPosition(Symbol_2, OP_BUY, Lots_2,0,0,Magic);
if(StopLoss_2>0 || TakeProfit_2>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET))ModifyOrder(-1, SL, TP, clModifyBuy); }
                                   }}//если нет поз. бай и поз. селл по 2-му символу

Sembra essere corretto per logica, ma apre ancora diverse posizioni per un simbolo.

P.S. Non sono il programmatore. Se è possibile in più dettagli spiegare al dummie.