Características úteis da KimIV - página 118

 
borilunad:
Isto e aquilo, muitas chamadas desnecessárias para outras funções com os erros resultantes!

Bem, você já cometeu erros...

É simples e direto: você pode editá-lo de acordo com suas necessidades.

 
KimIV:


Você pode desenhar algo semelhante a este...

atualização...

Em anexo um roteiro para testar a função ExistOPNearPrice()

Conseguiu, não sei se está correto.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    op - торговая операция               (    -1      - любая операция)     |
//|    mn - MagicNumber                     (    -1      - любой магик)        |
//|    price - заданная цена                (    -1 - текущая цена рынка       |  
//|    ds - расстояние в пунктах от цены    (  1000000   - по умолчанию)       |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarkets(string sy="", int op=-1, int mn=-1, double price = -1, int ds=1000000) {
  int i, k=OrdersTotal(), ot;

  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.00001; else p=0.001;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (OrderSymbol()==sy) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) {
            if ((price<0 && MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) ||
                (price>0 && MathAbs(price-OrderOpenPrice())<ds*p)) 
               {
                return(True);
               }
          }
          if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) {
            if ((price<0 && MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) ||
                (price>0 && MathAbs(OrderOpenPrice()-price)<ds*p)) 
               {
                return(True);
               }
          }
        }
      }
    }
  }
  return(False);
}
 
artmedia70:

Bem, você já cometeu erros...

É simples e direto: ajuste como você quiser.

Obrigado. Sim, eu já me contentei com outros truques.
 
khorosh:

Fê-lo, não sei se está certo.

Parece estar certo... É universal ))))
 

Preço de Correção().


Em um dos meus EAs eu precisei uma vez reduzir drasticamente o número de 130 erros de "Paradas Inválidas". Meus argumentos de que não se deve usar pequenas paradas e tomar pontos e que há um limite para seu valor mínimo estabelecido pela configuração do servidor comercial chamado STOPLEVEL não convenceram o cliente. Afinal, disse ele, poderíamos de alguma forma processar este erro antes de enviar um pedido comercial ao servidor. Eu me casei, se não houvesse erro, como poderia ser tratado. Mas um pensamento entrou em meu cérebro e começou a funcionar e deu origem a esta função.

Função Corrigir Preço() destina-se a corrigir os principais níveis de preços de pedidos e posições para atender ao requisito STOPLEVEL antes de enviar um pedido de negociação ao servidor, ou seja, antes de preparar os dados iniciais.

Todos os parâmetros desta função são obrigatórios, não há valores padrão. Além disso, os três últimos parâmetros são passados por referência, ou seja, eles conterão o resultado do trabalho da função. A função aceita os seguintes parâmetros:
  • sy - Nome de um instrumento comercial. O valor vazio "" ou NULL indicará o instrumento comercial atual (símbolo).
  • op - Operação comercial. São permitidos os seguintes valores: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLLIMIT, OP_BUYSTOP e OP_SELLSTOP.
  • pp - Preço aberto/definido da posição/ordem.
  • sl - Nível de preço StopLoss.
  • tp - Nível de preço TakeProfit.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2013                                                     |
//|  Описание : Выполняет корректирование ценовых уровней под STOPLEVEL.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование торгового инструмента                                 |
//|    op - торговая операция                                                  |
//|    pp - цена открытия/установки                                            |
//|    sl - ценовой уровень StopLoss                                           |
//|    tp - ценовой уровень TakeProfit                                         |
//+----------------------------------------------------------------------------+
void CorrectingPrice(string sy, int op, double& pp, double& sl, double& tp) {
  if (sy=="" || sy=="0") sy=Symbol();
  RefreshRates();
  int    di=MarketInfo(sy, MODE_DIGITS);
  int   msl=MarketInfo(sy, MODE_STOPLEVEL);
  int    sp=MarketInfo(sy, MODE_SPREAD);
  double mp=MarketInfo(sy, MODE_POINT);
  double pa=MarketInfo(sy, MODE_ASK);
  double pb=MarketInfo(sy, MODE_BID);
  double ds=NormalizeDouble(pp-sl, di);
  double dp=NormalizeDouble(pp-tp, di);

  if (msl==0) msl=2*sp;
  switch (op) {
    case OP_BUY:
      pp=pa;
      sl=pp-ds;
      tp=NormalizeDouble(pp-dp, di);
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELL:
      pp=pb;
      sl=NormalizeDouble(pp-ds, di);
      tp=pp-dp;
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_BUYLIMIT:
      if (pp>pa-msl*mp) {
        pp=pa-msl*mp;
        sl=pp-ds;
        tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_BUYSTOP:
      if (pp<pa+msl*mp) {
        pp=pa+msl*mp;
        if (sl>0) sl=pp-ds;
        if (tp>0) tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELLLIMIT:
      if (pp<pb+msl*mp) {
        pp=pb+msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_SELLSTOP:
      if (pp>pb-msl*mp) {
        pp=pb-msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    default:
      Message("CorrectingPrice(): Неизвестная торговая операция!");
      break;
  }
}

 
KimIV:

Preço de Correção().


Em um dos meus EAs eu precisei uma vez reduzir drasticamente o número de 130 erros de "Paradas Inválidas". Meus argumentos de que não se deve usar pequenas paradas e tomadas, que há um limite de seu valor mínimo que é estabelecido pela configuração do servidor comercial chamado STOPLEVEL, não convenceram o cliente. Afinal, ele disse que poderíamos de alguma forma processar este erro antes de enviar um pedido comercial ao servidor. Eu me casei, se não houvesse erro, como poderia ser tratado. Mas um pensamento entrou em meu cérebro e começou a funcionar e deu origem a esta função.

Função Corrigir Preço() destina-se a corrigir os principais níveis de preços de pedidos e posições para atender ao requisito STOPLEVEL antes de enviar um pedido de negociação ao servidor, ou seja, antes de preparar os dados iniciais.

Todos os parâmetros desta função são obrigatórios, não há valores padrão. Além disso, os três últimos parâmetros são passados por referência, ou seja, eles conterão o resultado do trabalho da função. A função aceita os seguintes parâmetros:
  • sy - Nome de um instrumento comercial. O valor vazio "" ou NULL indicará o instrumento comercial atual (símbolo).
  • op - Operação comercial. São permitidos os seguintes valores: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLLIMIT, OP_BUYSTOP e OP_SELLSTOP.
  • pp - Abertura/estabelecimento do preço da posição/ordem.
  • sl - Nível de preço StopLoss.
  • tp - Nível de preço TakeProfit.

Igor, algumas corretoras usam Spread*2 em vez de StopLevel, que tem valor zero. Revendo brevemente o código, eu não notei a verificação desta situação. Seria bom corrigir o código para verificar esta situação, caso contrário, isso causará os mesmos erros que 130
 
artmedia70:
Igor, algumas corretoras usam Spread*2 em vez de StopLevel que tem valor zero. Após um rápido olhar sobre o código, não vi nenhuma verificação para esta situação. Seria bom ajustar o código para verificar esta situação, caso contrário, serão os mesmos 130 erros.


Artem, eu não conheci tal DC... Você pode me enviar um par deles em sua mensagem pessoal? Vou ler o regulamento comercial...

Ou há uma maneira mais simples de fazer isso? Você pode me dizer, é correto o suficiente para usar tal correção?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

ATUALIZAÇÃO: Corrigi a funçãoCorrectingPrice().

 

Uma nova versão da função CorrectTF().

Há algum tempo atrás fui criticado pela funçãoCorrectTF() alegando que sua funcionalidade não corresponde a seu nome. De fato, ele ajusta o prazo para o mínimo próximo e não apenas para o mais próximo. Calculei os valores médios aritméticos entre os intervalos de tempo padrão e reescrevi a função de acordo com sua descrição.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.05.2013                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество минут).                               |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame) {
  if (TimeFrame>     1 && TimeFrame<    3) return(PERIOD_M1);
  if (TimeFrame>=    3 && TimeFrame<   10) return(PERIOD_M5);
  if (TimeFrame>=   10 && TimeFrame<   23) return(PERIOD_M15);
  if (TimeFrame>=   23 && TimeFrame<   45) return(PERIOD_M30);
  if (TimeFrame>=   45 && TimeFrame<  150) return(PERIOD_H1);
  if (TimeFrame>=  150 && TimeFrame<  840) return(PERIOD_H4);
  if (TimeFrame>=  840 && TimeFrame< 5760) return(PERIOD_D1);
  if (TimeFrame>= 5760 && TimeFrame<26640) return(PERIOD_W1);
  if (TimeFrame>=26640                   ) return(PERIOD_MN1);
}
 
KimIV:


Artem, eu não conheci tal DC... Você pode me enviar um par deles em sua mensagem pessoal? Vou ler o regulamento comercial...

Caiu

Ou você poderia fazer algo mais simples. Você pode me dizer, é correto o suficiente para usar tal correção?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

Naturalmente, tudo está correto.

ATUALIZAÇÃO: corrigi a funçãoCorrectingPrice().

Igor, eu praticamente faço o mesmo em EAs, sempre leio os dados primeiro e atribuo o valor necessário ao nível de variável, depois verifico os cálculos com ele.
 
KimIV:


Artyom, não encontrei nenhum CD como esse... Você pode me enviar um par deles em sua mensagem pessoal? Vou ler o regulamento comercial...

Ou você pode fazê-lo de uma maneira mais simples. Diga-me você mesmo, é correto o suficiente para usar tal emenda?

ATUALIZAÇÃO: Fiz uma emenda na funçãoCorrectingPrice().

Olá, colegas, ainda estou estudando o código, não consigo entender bem as sutilezas e estou em um dilema um pouco difícil.

Pelo que entendi, temos que chamar esta função para corrigir os parâmetros antes de fazer um pedido.

Existe tal linha para abrir um pedido:

if(buy === true && Open[0]>UpTr && Trade) {

buy=OrderSend(Symbol(),OP_BUYSTOP,LOT(),NormalizeDouble(op,Digits),slippage,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits), "T",Magic,0,MediumBlue);

é aqui que deve ser abordado? E como fazer isso corretamente. Ou este comando não precisa deCorrectingPrice()?

Agradecemos antecipadamente.

Razão: