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

 
Roman.:

IMHO, non complicato, ma molto facile da "dirigere" o inviare,

Beh, è certamente più facile "inviare" cioè "spedire" che suggerire. E infatti non ho chiesto nulla per punzecchiarmi in un libro di testo. Ha scritto un duplicato in un posto, è vero, ma l'essenza non cambia.

artmedia70:

Infine, dimmi esattamente cosa vuoi fare... Per esempio: MAK so-and-so sta salendo ed è sopra MAK so-and-so e il prezzo è ad un certo punto sotto/sopra MAK so-and-so e se è vero, allora piazza un ordine pendente ad una certa distanza. Vi darò un algoritmo approssimativo. Perché è difficile indirizzarvi nella giusta direzione, quando i vostri frammenti di codice sono strappati dal contesto. Dopo tutto il compito è per la quinta elementare (esageratamente)



Qui allego una versione di prova del codice e la pubblico anche nel mio post.

//+-----------------------------------------------------------------------------------+
//|                                                                       test_Ma.mq4 |
//|                                                                               hoz |
//|                                                                                   |
//+-----------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = " ___________ Параметры МА ____________ ";
extern int i_TF = 0,
           i_fastMaPeriod = 10,
           i_slowMaPeriod = 21;
extern string ___H1 = " _____ Параметры ордера _______";
extern int i_magic = 3333021;
extern double i_thresholdFromMa = 5;                           // Отступ от МА
// Машечки
double fastMa,
       slowMa;
double pt;
// Переменные рыночного окружения
double g_spread,
       g_stopLevel,
       g_tickSize;
// Идентификаторы положений машек
#define MA_DIRECT_TO_UP      0                                 // Машки направлены вверх
#define MA_DIRECT_TO_DOWN    1                                 // Машки направлены вниз
#define MA_DIRECT_TO_NONE   -1                                 // Машки во флете
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   GetMarketInfo();
   
   if (Digits  == 2 || Digits == 4)
       pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
   if (Digits == 6)
       pt = Point * 100;
   if (Digits == 7)
       pt = Point * 1000;
   

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сбор рыночных данных                                                                |
//+-------------------------------------------------------------------------------------+
void GetMarketInfo()
{
  g_spread = MarketInfo(Symbol(),MODE_SPREAD);
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE);
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa + i_thresholdFromMa * pt) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником

       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
   
   if (ticket > 0)
 
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa - i_thresholdFromMa * pt) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
   
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(fastMa - i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0)
    
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
int GetStateMa(double fastMa, double slowMa)
{
   if (fastMa > slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_UP);                 // ..машки направлены вниз
   
   if (fastMa < slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_DOWN);               // машки направлены вверх
   
   return (MA_DIRECT_TO_NONE);                   // Машки не имеют выраженного направления
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   if (signal == SIGNAL_BUY)                     // Если сигнал на покупку..
       if (!OpenBuy(fastMa, slowMa))             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell(fastMa, slowMa))           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)       // Если машки указывают вверх..
       if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
           return(SIGNAL_BUY);                       // ..функция возвращает сигнал покупки

   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)      // Если машки указывают вниз..
       if ( MathAbs(Bid - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
       return(SIGNAL_SELL);                          // ..функция возвращает сигнал продажи
   
   return (SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,1);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,1);

// Отслеживание открытия нового бара
   static datetime lastBarTime = 0;    // Время проведения последних рассчётов
   
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                      // ..уже были выполнены

// Рассчёт сигнала   
   int signal = GetSignal();
   
// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);
   
   lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
                                       // .. успешно выполнены
  return (0);
}

Le condizioni dicono chiaramente che il prezzo dell'ordine è sopra (sotto) la MA+(-) compensata dalla MA.

Ecco qui:

if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt )

Il segnale dovrebbe essere calcolato solo quando il prezzo si trova nellazona di "gap" della MA +(-) indentata.

In una funzione di acquisto, per esempio:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

Buy deve essere superiore afastMa dii_thresholdFromMa * pt.

Infatti, non c'è. O è un difetto della lingua o è un bug nella sventagliata. Come posso spiegare altrimenti ciò di cui ho bisogno? Ho dato l'intero codice senza condizioni e funzioni aggiuntive (solo un segnale nudo e aperto).

È già scritto chiaramente(per un tester, non l'ho controllato per davvero!)

Ecco come si apre:

Posto sbagliato per aprire...

artmedia70:


Per quanto riguarda l'evidenziato: lavorare sui prezzi aperti, quindi non ci sarà nessun ridisegno delle MA sulla barra zero

Ho fatto appositamente una condizione sulla prima barra, così non c'è confusione. La cosa principale è come farlo funzionare...
File:
test_ma.mq4  8 kb
 
Il flag di inizio, ad esempio, dei quarti cinque minuti di ogni ora deve essere definito nell'indicatore.
if( Minute()==15)
Non manca nulla. Spingilo nella giusta direzione.
 

Ho una domanda - se uso una media mobile con uno spostamento a destra quando formulo i miei criteri di trading - cioè il valore dello spostamento è positivo.

Poi, quando si forma il segnale, non dovrei usare il valore della media mobile sullo zero o sulla prima barra, ma sulla barra con l'indice corrispondente al valore dello spostamento.

 
Operr:
Il flag di inizio, ad esempio, dei quarti cinque minuti di ogni ora deve essere definito nell'indicatore.


if( Minute()==15)// так будет работать в течении 1 минуты (от 15 до 16)
if( Minute()>=15)// так от 15 минут и до конца текущего часа
 
Tincup:

Ho una domanda - se uso una media mobile con uno spostamento a destra quando formulo i miei criteri di trading - cioè il valore dello spostamento è positivo.

Poi, quando si forma il segnale, non dovrei usare il valore della media mobile sullo zero o sulla prima barra, ma sulla barra con l'indice corrispondente al valore dello spostamento.


Metti la media mobile sul grafico e vedi di quale indice hai bisogno. Lo si può vedere visivamente.
 
hoz:

Beh, senza dubbio è più facile "inviare" cioè "spedire" che suggerire. In effetti, non ho chiesto niente che mi faccia da palo in un libro di testo. Ho scritto un duplicato in un posto, ma l'essenza non cambia.

Qui allego la variante del codice di prova e la pubblico anche nel mio post.

Le condizioni dicono chiaramente che il prezzo dell'ordine è sopra (sotto) la MA+(-) compensata dalla MA.

Ecco qui:

Il segnale dovrebbe essere calcolato solo quando il prezzo si trova nellazona di "gap" della MA +(-) indentata.

In una funzione di acquisto, per esempio:

Buy deve essere superiore afastMa dii_thresholdFromMa * pt.

In realtà non c'è. O è un bug della mia lingua o è un bug del mio mouse. Come posso spiegare altrimenti ciò di cui ho bisogno? Ho dato un intero codice senza condizioni e funzioni aggiuntive (solo un segnale nudo e l'apertura).

È già scritto chiaramente(per un tester, non l'ho controllato per davvero!)

Ecco come si apre:

Ho fatto deliberatamente una condizione sulla prima barra, così non c'è confusione. La cosa principale è come farlo funzionare...
Ancora una volta, chiedo: quando esattamente volete fare l'ordine? Non la tua risposta in codice (non voglio capirlo - ci sono abbastanza dei loro codici per l'analisi), e solo parole,

Per esempio: voglio piazzare un ordine pendente sopra/sotto una MA a una distanza di ... bah, bah, bah, bah, bah, bah, bah ...

Per la seconda volta, mi spieghi, è così difficile? Avremmo risolto il tuo problema molto tempo fa.

 
Inoltre: se avete fastMA e slowMA definiti come globali, perché passarli a una funzione? Tutte le funzioni possono vederli comunque, senza passare i loro parametri alla funzione chiamata.
 

Buon pomeriggio.

Potete per favore consigliare come trattare i GAPs negli EAs?

Ricevo spesso GEP durante il fine settimana, e dopo che si verificano il lavoro con gli ordini si blocca, come risolvere il problema, grazie in anticipo!

 

Artyom, cosa pensi che funzionerà più velocemente, l'espressione con MathMax o con if?

double dist = MathMax(MathMax(NormalizeDouble(Dist*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//это?
// или это?
double dist = NormalizeDouble(Dist*Point,Digits);
if(dist < spread) dist = spread;
if(dist < StopLevel) dist = StopLevel;
if(dist < FreezeLevel) dist = FreezeLevel;


Non l'ho spiegato a parole, perché è chiaro che questa espressione mi serve per evitare gli errori 130, e mi serve perfettamente!

Grazie in anticipo!

 
hoz:

Metti la media sul grafico e vedi di quale indice hai bisogno. Lo si può vedere visivamente.

L'ho fatto. Non ho capito bene la sua risposta, quindi glielo chiedo di nuovo. Ho capito bene che quando si formulano le condizioni di trading

Dovresti usare il valore MA per il corrispondente numero di barre all'indietro, ma non il valore segnato con una freccia gialla nell'immagine.

Ho disegnato la figura come ho capito la tua risposta.