Domande da un "manichino" - pagina 5

 

Ho fatto uno script che cambia la dimensione dello stop loss a 200 pips, ma c'è un errore invece di spostare lo stop

//+------------------------------------------------------------------+
//|                                                      traling.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
double BuyStoploss=200;
double SellStoploss=200;
double sl,tp;
void OnStart()
  {
//---
MqlTradeRequest m_request;
MqlTradeResult m_result;
 if(PositionSelect(_Symbol))
           {
            //--- если позиция buy
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
              {
               //--- получаем значение стоплосс для позиции buy
               sl=BuyStoploss;
               //--- определяем допустимый уровень установки стоплосс для позиции buy
               double minimal=SymbolInfoDouble(_Symbol,SYMBOL_BID)-_Point*SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
               //--- нормализация значения
               sl=NormalizeDouble(sl,_Digits);
               //--- нормализация значения
               minimal=NormalizeDouble(minimal,_Digits);
               //--- если на полученный от индикатора уровень невозможно установить стоплосс, 
               //    он будет установлен на ближайший возможный уровень
               sl=MathMin(sl,minimal);
               //--- значение стоплосс позиции
               double possl=PositionGetDouble(POSITION_SL);
               //--- нормализация значения
               possl=NormalizeDouble(possl,_Digits);
               //--- если новое значение стоплосс выше, чем текущее значение стоплосс, 
               //    будет выполнена попытка переместить стоплосс на новый уровень
               if(sl>possl|| possl==0)
                 {
                  //--- заполнение структуры запроса
                  m_request.sl=sl;
                  //--- заполнение структуры запроса
                  m_request.tp=PositionGetDouble(POSITION_TP);
                  //--- запрос
                  OrderSend(m_request,m_result);
                  //--- проверка результата выполнения запроса
                  if(m_result.retcode!=TRADE_RETCODE_DONE)
                    {
                     //--- вывод в журнал сообщения об ошибке 
                     printf("Не удалось переместить стоплосс позиции %s, ошибка: %I64u",_Symbol,m_result.retcode);
                     //--- не удалось переместить стоплосс, завершаем выполнение
                     //return(false);
                    }
                 }
              }
           
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
              {
               sl=SellStoploss;
               //--- прибавляется спред, поскольку sell закрывается по цене Ask
               sl+=(SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID));
               double minimal=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+_Point*SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
               sl=NormalizeDouble(sl,_Digits);
               minimal=NormalizeDouble(minimal,_Digits);
               sl=MathMax(sl,minimal);
               double possl=PositionGetDouble(POSITION_SL);
               possl=NormalizeDouble(possl,_Digits);
               if(sl<possl || possl==0)
                 {
                  m_request.sl=sl;
                  m_request.tp=PositionGetDouble(POSITION_TP);
                  OrderSend(m_request,m_result);
                  if(m_result.retcode!=TRADE_RETCODE_DONE)
                    {
                     printf("Не удалось переместить стоплосс позиции %s, ошибка: %I64u",_Symbol,m_result.retcode);
                     //return(false);
                    }
                 }
              }
           }  
  }
//+------------------------------------------------------------------+
 
Qual è l'errore?
 
Khomtchenko:

Ho fatto uno script che cambia la dimensione dello stop loss a 200 pips, ma c'è un errore invece di spostare lo stop

Avete sl ovunque in pip e ne avete bisogno in prezzi.
 
Capito. Farò un tentativo.
 

Qui. Semplificato e aggiunto un messaggio su cosa SL e TP lo script sta cercando di fare. Le fermate sono già nei prezzi

//+------------------------------------------------------------------+
//|                                                      traling.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
double Stoploss=0.00200;
double TP=0.01200;
double sl,tp;
double ask; 
double bid; 
void OnStart()
  {
//---
MqlTradeRequest m_request;
MqlTradeResult m_result;
MqlTick last_tick;
 SymbolInfoTick(_Symbol,last_tick);
 ask=last_tick.ask;
 bid=last_tick.bid;
 if(PositionSelect(_Symbol))
           {
            //--- если позиция buy
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
              {
                  sl=ask-Stoploss;
                  NormalizeDouble(sl,_Digits);
                  m_request.sl=sl;
                  tp=ask+TP;
                  NormalizeDouble(tp,_Digits);
                  //sl=ask-sl;
                  m_request.tp=tp;
                  Alert("SL=",sl," TP=",tp);
                  if (OrderSend(m_request,m_result)) Alert("ok");
                  
                 }
              
           
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
              {
               sl=bid+Stoploss;
               NormalizeDouble(sl,_Digits);
                  m_request.sl=sl;
                  tp=bid-TP;
                  NormalizeDouble(tp,_Digits);
                  m_request.tp=tp;
                  Alert("SL=",sl," TP=",tp);
                  if (OrderSend(m_request,m_result)) Alert("ok");
                  
                 
              }
            }
  }
//+------------------------------------------------------------------+

Ma non succede niente.

 

Ciao a tutti. Potete dirmi se esiste un Expert Advisor per questo sistema?

Credo che si chiami "seguire la tendenza".

- La posizione lunga sarà aperta se il prezzo di chiusura è superiore al prezzo massimo delle ultime 20 barre;

- chiudere una posizione lunga se il prezzo di chiusura è inferiore al prezzo minimo delle ultime 10 barre;

- aprire una posizione corta se il prezzo di chiusura è inferiore al prezzo minimo delle ultime 20 barre; chiudere una posizione corta se il prezzo di chiusura è inferiore al prezzo minimo delle ultime 10 barre

- chiudere una posizione corta se il prezzo di chiusura è superiore al prezzo massimo delle ultime 10 barre.

O forse le persone gentili possono aiutarti a scriverlo?

 
papaklass:

La modifica degli arresti richiede l'inclusione di alcuni campi nella query:

È qui che la vostra fermata dovrebbe cambiare dopo una tale richiesta.

Sì, ma mi chiedo: perché le nuove fermate devono scivolare?
 

Ho una domanda, non ho deciso di creare un thread separato per questo, spero che l'autore non si offenda e che la domanda non vada persa.

La domanda riguarda i Trading Signal Modules - https://www.mql5.com/ru/docs/standardlibrary/expertclasses/csignal e prendiamo per esempio la descrizione dei segnali MACD"Divergenza - il primo trough dell'oscillatore analizzato è meno profondo del precedente e il trough del prezzo corrispondente è più profondo del precedente" - è interessante guardare il codice come viene cercato questo segnale. Apriamo SignalMACD.mqh ma ci sono invece le condizioni IS_PATTERN_USAGE(0) e così via.

Come posso vedere il codice di come viene cercata la divergenza stessa? Cioè, come fa a confrontare una candela con un altro indicatore su una barra all'altra, dov'è questo codice?

Документация по MQL5: Стандартная библиотека / Классы торговых стратегий / Модули торговых сигналов
Документация по MQL5: Стандартная библиотека / Классы торговых стратегий / Модули торговых сигналов
  • www.mql5.com
Стандартная библиотека / Классы торговых стратегий / Модули торговых сигналов - Документация по MQL5
 

Alcuni DC nei conti reali assegnano ogni sorta di prefissi come "." o "FXF" ai nomi dei simboli.

Come posso usare questi prefissi?

L'ho fatto in questo modo:

#define DEF_SPEC "FXF"

stringa SymbolsTrade[] = {"AUDCAD "DEF_SPEC ... -non funziona

stringa SymbolsTrade[] = {"AUDCAD "+DEF_SPEC ... -non funziona nemmeno così

come risultato ottengo solo FXF invece di AUDCADFXF.

Puoi dirmi come si fa?

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 
T-G:

Ho una domanda, spero che l'autore non si offenda e che la domanda non vada persa.

La domanda riguarda i Trading Signal Modules - https://www.mql5.com/ru/docs/standardlibrary/expertclasses/csignal e prendiamo per esempio la descrizione dei segnali MACD"Divergenza - il primo trough dell'oscillatore analizzato è meno profondo del precedente e il trough del prezzo corrispondente è più profondo del precedente" - è interessante guardare il codice come viene cercato questo segnale. Apriamo SignalMACD.mqh ma ci sono invece le condizioni IS_PATTERN_USAGE(0) e così via.

Come posso vedere il codice di come viene cercata la divergenza stessa? Cioè, come è il confronto di una candela con un altro indicatore su una barra, dove si trova questo codice?

Potete vedere il codice nel codice sorgente. Ci sono due metodi per cercare la divergenza:

1. Il metodo bool CSignalMACD::ExtState(int ind) - prepara i dati per la ricerca;

2. Il metodo bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start) cerca un modello di mercato con i parametri specificati.

Se aiuta, ecco i commenti ai metodi in russo:

Per il metodo bool CSignalMACD::ExtState(int ind)

//--- результатом работы этого метода является битовая карта экстремумов
//--- фактически, битовая карта экстремумов представляет собой "массив" 4-битовых полей
//--- каждый "элемент массива" однозначно описывает соотношение
//--- текущих экстремумов осцилятора и цены с предыдущими
//--- назначение битов элемента анализируемой битовой карты
//--- бит 3 - не используется (всегда 0)
//--- бит 2 - имеет значение 1 если текущий экстремум осцилятора "экстремальней" предыдущего
//---         (более высокий пик или более глубокая впадина), иначе 0
//--- бит 1 - не используется (всегда 0)
//--- бит 0 - имеет значение 1 если текущий экстремум цены "экстремальней" предыдущего
//---         (более высокий пик или более глубокая впадина), иначе 0
//--- кроме того, формируются:
//--- массив значений экстремумов осцилятора,
//--- массив значений экстремумов цены и
//--- массив "расстояний" между экстремумами осцилятора (в барах)
//--- следует отметить, что при использовании результатов расширенной проверки состояния,
//--- нужно учитывать, какой экстремум осцилятора (пик или впадина)
//--- является "точкой отсчёта" (т.е. был обнаружен при анализе первым)
//--- если первым был обнаружен пик, то чётные элементы всех массивов
//--- будут содержать данные о пиках, нечётный данные о впадинах
//--- если первой была обнаружена впадина, соответственно, наоборот

Per il metodo bool CSignalMACD::CompareMaps(int map,int count,bool minimax,int start)

//--- битовая карта образца представляет собой "массив" 4-битовых полей
//--- каждый "элемент массива" однозначно описывает искомое соотношение
//--- текущих экстремумов осцилятора и цены с предыдущими
//--- назначение битов элемента образца битовой карты
//--- бит 3 - имеет значение 1 если нам неважно соотношение экстремумов осцилятора
//---         имеет значение 0 если мы хотим "найти" соотношение экстремумов осцилятора определённое значением бита 2
//--- бит 2 - имеет значение 1 если мы хотим "найти" ситуацию когда текущий экстремум осцилятора "экстремальней" предыдущего
//---         (текущий пик более высокий или текущая впадина более глубокая)
//---         имеет значение 0 если мы хотим "найти" ситуацию когда текущий экстремум осцилятора менее "экстремальный" чем предыдущий
//---         (текущий пик менее высокий или текущая впадина менее глубокая)
//--- бит 1 - имеет значение 1 если нам неважно соотношение экстремумов цены
//---         имеет значение 0 если мы хотим "найти" соотношение экстремумов цены определённое значением бита 0
//--- бит 0 - имеет значение 1 если мы хотим "найти" ситуацию когда текущий экстремум цены "экстремальней" предыдущего
//---         (текущий пик более высокий или текущая впадина более глубокая)
//---         имеет значение 0 если мы хотим "найти" ситуацию когда текущий экстремум цены менее "экстремальный" чем предыдущий
//---         (текущий пик менее высокий или текущая впадина менее глубокая)