Caratteristiche utili da KimIV - pagina 92

 
alexpert007 >> :

Ed ecco un'altra domanda per Igor.

Avete creato una funzione separata personalizzata (o altra) per capovolgere la posizione di acquisto-vendita e viceversa, senza il solito OrderClose - OrderSend?

Non sono Igor, ma c'è una funzione standard OrderCloseBy per il flipping.

 

Ciao, ho bisogno di aiuto per risolvere un problema. Provo a descriverlo:

C'è una funzione che conta gli ordini:

int OrdersAll(int mag)
{
int kolvo=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
}
}
return(kolvo);
}

Inoltre, nel processo, se non c'è nessun ordine per il simbolo corrente, quando la condizione è soddisfatta, dovrebbe essere piazzato 1 ordine, per esempio, per comprare:

if(OrdersAll(MAGICNO)==0)
{
if(condition)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits),"",MAGICNO,0,Blue);
if(err<0)
{
Print("OrderSend()- Error OP_BUY. L'ordine non è accettato. op "+op+" sl "+sl+" tp "+tp+""+GetLastError());return(-1);
}
}
}

Invece, quando si aprono diversi simboli nel terminale e si esegue l'EA in ognuno di essi, per esempio, il codice di cui sopra può aprire un ordine - questo è corretto, ma allo stesso tempo può aprire 20-30 ordini fino all'esaurimento del tricheco, se la condizione tiene per diversi tick. Non l'ho ancora visto accadere su un singolo strumento, ma non sono affatto sicuro che non accadrà nemmeno su un singolo strumento. Come posso correggere il mio codice per rendere difficile l'apertura di non più di un ordine.

 

Igor, buona sera,

Non riesco a gestire la tua chiamata di funzione:

//+----------------------------------------------------------------------------+
//| Autore: Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versione : 19.02.2008 |
//| Descrizione: restituisce il profitto totale delle posizioni aperte nella valuta di deposito
//+----------------------------------------------------------------------------+
//| Parametri: |
//| sy - nome dello strumento (" - qualsiasi simbolo, |
//| NULL - simbolo corrente) |
| //| op - operazione (-1 - qualsiasi posizione) |
//| mn - MagicNumber (-1 - qualsiasi magia) |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
doppio p=0;
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
per (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
ritorno(p);
}

Potete dirmi, nella chiamata TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1);

1. Supponiamo EURUSD, deve essere tra virgolette "EURUSD" o è permesso senza;

2. Quale dovrebbe essere il secondo parametro di chiamata (dove è un trattino) per calcolare il profitto totale di acquisto e vendita (ho provato il default -1; non è corretto)

3. il terzo parametro è il numero magico di Expert Advisor? - Non ci sono ancora arrivato, solo una domanda se ho capito bene il parametro.

Grazie.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1);

- solo per EURUSD

- tutte le posizioni aperte (-1)

- posizioni con qualsiasi magia (-1)

 

Buon pomeriggio.

Come sapete, Sleep() non funziona nel tester del terminale, quindi dovete usare i cicli delle funzioni matematiche per ritardare l'esecuzione:

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000; z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

dove zFILE è il ritardo di esecuzione dell'Expert Advisor.

La mia domanda è: c'è una soluzione più sofisticata, perché ho bisogno di un certo ritardo da pochi secondi a 10-20min (elaborazione dei dati da parte di un programma esterno)?

O almeno come misurare il tempo di esecuzione in modo più accurato (perché le prestazioni dei processori sono diverse) e prendere il più lento?





 
Piboli >> :

Domanda: c'è una soluzione più elegante (funzione di ritardo), dato che il ritardo è necessario da pochi secondi a 10-20min (elaborazione dei dati da parte di un software esterno) ?

Non ha provato a usare callback e sincronizzatori?

 

Funzioni di Kim

Mi chiedo se c'è una funzione che permette di tirare il nome dell'ultimo modello

e registrare i cambiamenti nei suoi componenti


 

KimIV forse si può e scrivere un indicatore

L'indicatore dovrebbe cercare un canale piatto entro un determinato periodo di tempo e non più ampio di quanto specificato nelle impostazioni

Questo indicatore dovrebbe cercare il canale sia all'interno di un giorno che con transizione al giorno successivo come nella tua funzione isTradeTimeInt().
Questo indicatore può disegnare 5 canali durante un giorno o uno solo.
Nelle impostazioni

extern doppia altezza massima del canale in punti
extern int Bar_Time come calcoliamo l'intervallo di tempo in barre (1) o ore e minuti (2)
extern stringa intervallo di tempo minimo del canale in ore e minuti
extern int int intervallo di tempo minimo del canale in barre
extern int numero massimo di canali disegnati che rimangono disegnati

Allego un indicatore simile a https://www.mql5.com/ru/code ma disegna il canale in un intervallo di tempo strettamente impostato e non cerca tale canale da solo. Dovrebbe cercare solo un canale che non superi l'altezza massima del canale e non sia più corto dell'intervallo di tempo minimo del canale.
Se scegliamo Bar_Time per il tempo del canale, il canale(1) è calcolato dall'ora corrente meno il tempo dato nelle impostazioni, cioè 2 ore 15 minuti o un altro tempo dato. Se ora è 1 ora 15 minuti, cerca max e min da 23 ore 00 minuti e se il max meno il min è sotto l'altezza massima del canale, traccia due linee max e min da 23:00 a 02:15. Disegna anche i livelli Fibo sopra e sotto il canale.

Se scegliamo Bar_Time per numero di barre, il canale viene calcolato dalla barra corrente meno il numero di barre specificato nelle impostazioni, cioè dalla barra zero alla barra zero meno il numero specificato nelle impostazioni. Se il numero scelto è 50, cerchiamo il massimo e il minimo delle ultime 50 barre dalla barra zero e se il massimo meno il minimo non è più dell'altezza massima del canale, saranno disegnate due linee di massimo e minimo di 50 barre.

Tutti i livelli e i dati dei canali sono memorizzati nei buffer

 

Domanda a Igor

Se potete darmi un frammento di codice di un Expert Advisor per due conti separati (Buy Sell) che interroga ogni conto (per il calcolo della dimensione del lotto) e può trasferire un deposito da un conto all'altro e ritirarne una parte secondo certe condizioni (per esempio, profitto mensile o trimestrale - n% di esso)

Permettetemi di chiarire la mia domanda

1 Expert Advisor lavora su Buy (sondaggi stato del conto 2) . 6200

2 Expert Advisor apre la posizione Sell (richiede il saldo del conto a 1) ... 8400

Se non ci sono posizioni aperte

1100 dal conto 2 al conto 1

conto 1 - 7300

conto 2 - 7300

deposito lordo totale SD=14600 Rischio massimo - 10% Lotto massimo 0,14

Ulteriori

dal 01.04.09 SD=10000

dal 01.07.09 SD=14600

Profitto=4600

10% = 460

460 detratti sul terzo conto

Grazie

 

Caro Igor, aiutami!

Ho collegato a-SimpleTrailing.mqh.

Hoaggiunto ciò che è stato specificato, ma stanno spuntando 3 errori:

'clModifyBuy' - variabile non definita
'clModifySell' - variabile non definita
'ti' - variabile già definita

Cosa fare?(



Ecco cosa si adatta:

.........................
   total=OrdersTotal();
   if( total<1)
     {
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if( chk==1)
        {
         if((Low[0]<= MaDert1sell) || (Low[0]<= MaDert2sell))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>= MaDert1buy) || (High[0]>= MaDert2buy))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",GetLastError());
               return(0);
              }
           }
        }
      return(0);
     }
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if ( pp!= op || sl!= os || tp!= ot) {
    for ( it=1; it<= NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if ( fm) {
        if ( UseSound) PlaySound( NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(", er,") modifying order: ", ErrorDescription( er),", try ", it);
        Print("Ask=", pa,"  Bid=", pb,"  sy=",OrderSymbol(),
              "  op="+ GetNameOP(OrderType()),"  pp=", pp,"  sl=", sl,"  tp=", tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch ( op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+