Caratteristiche utili da KimIV - pagina 51

 
Caro Igor, mi scuso se ho offeso qualcuno... Non stavo davvero criticando, è un peccato che sembri così. In ogni caso, il prototipo pubblicato sarà corretto e perfezionato più di una volta. Così non ci saranno enigmi (non ho mai preteso di essere l'autore) vi manderò il lavoro per la revisione dell'autore in futuro. Mi vedo come il primo passo finora 25 pagine. Appena l'avrò finito lo invierò all'indirizzo menzionato nel vostro sito. Grazie per il vostro prezioso lavoro e la condivisione disinteressata dell'esperienza!!!
 
rid писал (а) >>

Penso che sia possibile. Apparentemente, è necessario controllare ad ogni livello (all'incrocio) qual è la dimensione attuale del lotto della posizione aperta. E proprio con questo criterio dovremmo implementare un meccanismo di chiusura!

Tali funzioni (che restituiscono la dimensione del lotto) sono disponibili in questo ramo. Guardate le pp. 17 и 27

Grazie mille! Hurrah! Ora posso andare avanti, grazie mille!

 

Per determinare se sono necessari o meno dei controlli supplementari della dimensione del lotto nella funzione OpenPosition(), bisogna vedere come calcola la dimensione del lotto e come e dove viene chiamata; non ho visto questa funzione nel ramo

double ll=GetSizeLot();

Forse mi sono perso .

Se è calcolato così https://championship.mql5.com/2012/ru/news, potresti avere un errore 134 e perdere il campionato :-)

 

Ciao KimIV.inviato una cosa dovrà scrivere di nuovo. Non sono molto bravo a programmare e sto studiando per essere un trader da 3 settimane. anche la mia grammatica non è buona.

qui. La mia domanda è questa. È possibile fare un EA usando l'indicatore CCi?

Livelli CCi 250, 50, -50, -250. L'idea è che quando raggiunge (incrocia) -50 e 50, rispettivamente, venderei o comprerei. Considera quando l'accordo dovrebbe fermarsi:

1Poi (diciamo che c'è una vendita) il grafico incrocia -250, poi incrocia nella direzione opposta -250 (si può vedere nell'immagine).

2 Il grafico non ha raggiunto 250 e incrocia di nuovo a 50.

Per l'acquisto, è lo stesso, ma viceversa.

Quotazione Euro/Dollaro, qualsiasi arco temporale.

Quanto costerebbe un peluche EA come questo????

Se il prezzo è lo stesso, puoi offrire qualcosa di meglio?

Grazie in anticipo. Lo spero. Beh, sono andato a un corso FOREX.

A proposito, il forex è un modo reale per guadagnare pane e burro????

 

Saluti a tutti.

Ho trovato questo indicatore, l'ho cambiato un po' - costruisce buone linee di tendenza.

Sarebbe interessante inventare una funzione... (è una specie di richiesta di KimIV).

File:
tlbs.mq4  8 kb
 
Prival писал(а) >>

Re.

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Forse sarebbe meglio chiamare OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44);

Questo suggerimento, Sergei, aumenta la convenienza dell'uso di fermate e prese impostate in pip. E i casi in cui gli stop and take sono fissati dai livelli di prezzo? Per esempio, uno stop al minimo o al massimo della barra precedente. O da una linea di qualche tipo. Viene tradotto in punti prima di chiamare la funzione e riconvertito in prezzi all'interno della funzione? Questa è un'operazione ridondante. Quindi lo lascerò così com'è.

Considereremo la funzione GetSizeLot() più tardi (a proposito, ora si chiama GetLots()). Prima di tutto, dobbiamo finire di usare le librerie b-ForTest.mqh e b-Positions.mqh.

 

La funzione CountOrders() per il tester.

Nelle mie versioni di prova (destinate all'uso solo nel tester di MT4) di Expert Advisors, la funzione CountOrders() sostituisce le seguenti funzioni: ExistOrders(), ExistPositions(), NumberOfOrders() e NumberOfPositions(). Cioè, può dare informazioni sull'esistenza di una posizione o di un ordine di qualsiasi tipo, così come informazioni sul numero di scambi di ogni tipo. Un tale scambio ha i suoi vantaggi, che si esprime in un riferimento unico alla base di ordini per un tick e ottenendo tutte le informazioni necessarie in una sola volta. E le funzioni di cui sopra, specialmente se usate insieme, ognuna di esse lavora con una e la stessa base d'ordine in modo indipendente, quindi fanno ripetutamente le stesse chiamate. Come risultato, la funzione CountOrders() può ridurre il tempo di un passaggio di diversi secondi, il che permette di risparmiare ore di ottimizzazione.

La funzione CountOrders() prende i seguenti parametri:

  • mo - Array del numero di ordini per tipo. Dopo l'esecuzione della funzione, l'array avrà 6 (sei) elementi. Elemento zero - numero di compravendite di tipo Buy, primo elemento - numero di ordini Sell, secondo elemento - BuyLimit, terzo elemento - SellLimit, quarto elemento - BuyStop, quinto elemento - SellStop.
  • mn - Identificatore di una posizione o di ordini (MagicNumber). Il valore predefinito è -1 - qualsiasi MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders(int& mo[], int mn=-1) {
  int i, k=OrdersTotal();

  if (ArraySize( mo)!=6) ArrayResize( mo, 6);
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ( mn<0 || OrderMagicNumber()== mn) mo[OrderType()]++;
    }
  }
}

P.S. In allegato c'è uno script per testare la funzione CountOrders() online.

File:
 

Buon pomeriggio, Igor e anche tutti gli altri. Ho un problema usando la funzione GetFractalBar(NULL,0, 0). - Restituisce il numero della barra frattale per il suo numero. Per essere più precisi, il problema non è con la funzione. Ma da qualche parte vicino.

Tutto va bene quando il commento viene visualizzato con questa impostazione. Ho il numero della barra nell'angolo del grafico.

int a;
... ...

int start()
  {
//----
if(Time[0] == prevtime)   return(0);//ждём нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

if ( isFractalUp() > isFractalDn() )  {//если это Down-фрактал

   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   
Comment( GetFractalBar(NULL,0, 0));            }

E tutto va bene quando mostro i numeri di commento nell'angolo del grafico. Vedo i valori del prezzo minimo della barra con il frattale nell'angolo sinistro.

if ( isFractalUp() > isFractalDn() ) {//если это Down-фрактал
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));

Comment(iLow(NULL,0, GetFractalBar(NULL,0, 0)));          }

Ma più in generale non è chiaro! Appena inserisco la variabile "a" nel commento invece della funzione stessa, il commento restituisce 1 nell'angolo invece del valore del prezzo! Qui:

if ( isFractalUp() < isFractalDn() ) {
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   Comment( a);                        }
Sono stato seduto per tre ore, non capisco cosa c'è che non va! Per favore, ditemi se potete....
 
Rita писал(а) >>
Appena inserisco la variabile "a" nel commento invece della funzione stessa, il commento restituisce 1 nell'angolo invece del valore del prezzo!

Avete dichiarato la variabile "a" come una variabile intera, cioè

int a;

Dovreste dichiararla come una variabile reale, cioè

doppio a;

 

Funzione ModifyOrder() per il tester.

Questa è una versione semplificata della funzione ModifyOrder(), pubblicata a pagina 7, ed è progettata per cambiare i livelli di prezzo assoluto di un ordine o di una posizione preselezionata.

La funzione ModifyOrder() accetta i seguenti parametri:

  • pp - Prezzo di impostazione dell'ordine. Se si passa un valore inferiore o uguale a zero, la modifica di questo livello di prezzo non sarà eseguita. Il valore predefinito è -1.
  • sl - Livello di prezzo di stop. Se passate un valore inferiore a zero, la modifica del livello dei prezzi non sarà eseguita. Il valore predefinito è 0.
  • tp - Prendi il livello dei prezzi. Se passate un valore inferiore a zero, la modifica del livello dei prezzi non sarà implementata. Il valore predefinito è 0.
  • ex - Data di scadenza dell'ordine in sospeso. Il valore predefinito è 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  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);

  if ( pp!= op || sl!= os || tp!= ot) {
    if (MathMod(OrderType(), 2)==0) cl= clModifyBuy; else cl= clModifySell;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(", er,") modifying order: ", ErrorDescription( er));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+ GetNameOP(OrderType())," pp=", pp," sl=", sl," tp=", tp);
    }
  }
}