Apenas "Recursos úteis do KimIV".

 

Todas as funções são retiradas deste tópico - h ttp://forum.mql4.com/ru/11287 , o tópico contém uma descrição detalhada de cada função e exemplos de seu uso

Contente

 Página #1 SetOrder - Configuração do pedido. Versão da função para backtests. ExistOrders - Retorna o sinalizador para a existência de ordens ExistPositions - Retorna o sinalizador para a existência de posições OpenPosition - Abrindo uma posição. Versão da função para backtests. OpenPosition - Abre uma posição e devolve seu ticket. Para on-line . Message - Exibindo uma mensagem nos comentários e no log GetNameTF - Retorna o nome do timeframe GetNameOP - Retorna o nome da operação de negociação ModifyOrder - Modificação de uma ordem pré-selecionada. DeleteOrders - Excluir pedidos. Versão da função para backtests. DeleteOrders - Excluir pedidos . Para on-line . FindNearFractal - Procura o fractal mais próximo ExistOrdersByLot - Retorna o sinalizador para a existência de um pedido por tamanho de lote. GetLotLastOrder - Retorna o tamanho do lote do último pedido colocado, ou -1 GetOrderOpenPrice - Retorna o preço do último pedido, ou 0. IndexByTicket - Retorna o índice do pedido ou posição no ticket
Página 2
NumberOfOrders - Retorna o número de pedidos.

ClosePosBySelect - Fecha uma posição pré-selecionada.

ClosePosBySizeProfitInCurrency - Fecha as posições que têm lucro na moeda de depósito de um determinado valor

ClosePosBySizeLossInCurrency - Fechando as posições cuja perda na moeda do depósito excedeu um determinado valor

ClosePositions - Fechar posições a preço de mercado

ClosePosFirstProfit - Fechar posições ao preço de mercado primeiro lucrativo

ClosePosWithMaxProfitInCurrency - Feche uma posição com o lucro positivo máximo na moeda de depósito

DistMarketAndPos- Retorna a distância em pontos entre o mercado e a posição mais próxima

ExistOPNearMarket - Retorna o sinalizador para a existência de uma posição ou ordem próxima ao mercado

ExistPosByPrice - Retorna o sinalizador para a existência de posições no preço de abertura

GetAmountLotFromOpenPos - Retorna a quantidade de lotes de posições abertas

Página #3
GetIndexByTicket - Retorna o índice da ordem ou posição por ticket.

Correlação - Retorna a correlação de duas séries.

GetIndexLastPos - Retorna o índice da última posição aberta ou -1

GetLotLastPos - Retorna o tamanho do lote da última posição aberta ou -1

GetMaxLotFromOpenPos - Retorna o tamanho máximo do lote de posições abertas

GetMinLotFromOpenPos - Retorna o tamanho mínimo do lote das posições abertas

NumberOfPositions - Retorna o número de posições.

GetProfitFromDateInCurrency - Retorna o lucro total na moeda de depósito das posições fechadas desde uma determinada data

GetProfitOpenPosInCurrency - Retorna o lucro total das posições abertas na moeda de depósito

GetProfitOpenPosInPoint - Retorna o lucro total das posições abertas em pontos

GetTicketLastPos - Retorna o ticket da última posição aberta ou -1

Página#4
GetTypeLastClosePos - Retorna o tipo da última posição fechada ou -1

GetTypeLastOpenPos - Retorna o tipo da última posição aberta ou -1

isCloseLastPosByStop - Retorna o sinalizador para fechar a última posição por stop

isCloseLastPosByTake - Retorna o sinalizador para fechar a última posição por take.

isLossLastPos - Retorna o sinalizador de perda da última posição.

isTradeToDay - Retorna o sinalizador de negociação para hoje

NumberOfBarCloseLastPos - Retorna o número da barra de fechamento da última posição ou -1.

NumberOfBarOpenLastPos - Retorna o número da última posição da barra aberta ou -1.

NumberOfLossPosToday - Retorna o número de posições perdedoras fechadas hoje.

PriceCloseLastPos - Retorna o preço de fechamento da última posição fechada.


Página #5
PriceOpenLastPos - Retorna o preço de abertura da última posição aberta.

PriceOpenLastClosePos - Retorna o preço de abertura da última posição fechada.

PriceOpenNearPos - Retorna o preço de abertura da posição mais próxima.

TicketNearPos - Devolve o ticket da posição mais próxima do mercado ao preço de abertura.

TypeNearPos - Retorna o tipo de posição mais próxima do mercado, ou -1.

TimeOpenLastPos - Retorna o horário de abertura da última posição aberta.

BubbleSort - Executa uma classificação de bolhas nos elementos de uma matriz.

BarsBetweenLastFractals - Retorna o número de barras entre os dois últimos fractais.

SecondsAfterCloseLastPos - Retorna o número de segundos após o fechamento da última posição.

SecondsAfterOpenLastPos - Retorna o número de segundos após a última posição ser aberta.

DeleteOppositeOrders - Excluir posição de ordem oposta

ArraySearchDouble - Procura um elemento em uma matriz por valor e retorna o índice do elemento encontrado, ou -1

ArraySearchInt - Procura um elemento em uma matriz por valor e retorna o índice do elemento encontrado, ou -1.

ArraySearchString - Procura um elemento de array por valor e retorna o índice do elemento encontrado, ou -1

GetLotLastClosePos - Retorna o tamanho do lote da última posição fechada ou -1

ArrayMax - Retorna o valor do elemento máximo em uma matriz.


Página #6
ArrayMin - Retorna o valor do elemento mínimo em uma matriz

GetExtremumZZBar - Retorna o número da barra extrema do ZigZag pelo seu número.

ArrayAvg - Retorna a média aritmética dos elementos da matriz.

ArrayAvGeom - Retorna a média geométrica dos elementos do array.

SetHLine - Defina o objeto OBJ_HLINE para uma linha horizontal
SetVLine - Defina o objeto OBJ_VLINE para uma linha vertical
SetTLine - Defina o objeto OBJ_TREND para a linha de tendência

SetTLineByAngle - Defina o objeto OBJ_TRENDBYANGLE da linha de tendência por ângulo

SetArrow - Configurando o ícone no gráfico, o objeto OBJ_ARROW.

SetLabel - Defina um rótulo de texto, um objeto OBJ_LABEL.

CrossPointOfLines - Calcula as coordenadas do ponto de interseção de duas linhas, cada linha é dada por um par de coordenadas de seus pontos.

SetRegression - Define o objeto OBJ_REGRESSION para o canal de regressão linear.

EquationDirect - Equação de uma linha reta. Calcula o valor Y para X no ponto de interseção com a linha.
GetArrowInterval - Retorna o intervalo para definir ponteiros de sinal
GetArrowInterval - Retorna o intervalo para definir ponteiros de sinal
FindNearFractal - Encontrando o fractal mais próximo. Retorna o nível de preço.
GetExtremumZZBar - Retorna o número da barra extrema do ZigZag pelo seu número.
GetExtremumZZPrice - Retorna o extremo do ZigZag pelo seu número.

GetFractalBar - Retorna o número da barra fractal por seu número.

GetNearestDownFractal - Retorna o nível de preço do fractal mais próximo

GetNearestUpFractal - Retorna o fractal mais próximo


Página #7
CorrectTF - Corrige o prazo para o MT4 suportado mais próximo.
DateBeginQuarter - Retorna a data de início do trimestre
DateOfMonday - Retorna a data de segunda-feira pelo número da semana

Fibonacci - Retorna o elemento da série de Fibonacci pelo seu número ordinal.
GetNameMA - Retorna o nome do método MA.
GetPriceDiffInPoint - Retorna a diferença de preço em pontos entre duas barras.

GetTypePrice - Retorna o nome do tipo de preço.
ArrayLR - Gera uma matriz de valores de regressão linear.
ArrayMo - Retorna o Modo - o máximo da curva de densidade de distribuição.

ExistOrdersByPrice - Retorna o sinalizador para a existência de pedidos ao preço definido

ClosePosBySelect - Fecha uma posição pré-selecionada
CountOrders - Calcula o número de pedidos por tipo.
ModifyOrder - Modificação do pedido. Versão da função para backtests.

IIFc - Retorna um de dois valores dependendo da condição.

IIFd - Retorna um de dois valores dependendo da condição.
IIFi - Retorna um dos dois valores dependendo da condição.
IIFs - Retorna um de dois valores dependendo da condição.
ExistInHistoryCloseBetween - Retorna o sinalizador de existência no histórico de uma posição ou ordem fechada (excluída) entre as datas.

ExistInHistoryOpenBetween - Retorna o sinalizador de existência no histórico de uma posição ou ordem aberta (definida) entre datas.

ExistInHistoryToDay - Retorna o sinalizador da presença de uma ordem ou posição no histórico para hoje

TakeProfitLastPos - Retorna o preço TakeProfit da última posição aberta ou -1.

Página #8
TakeProfitLastClosePos - Retorna o preço TakeProfit da última posição fechada ou -1.

MovingInWL - Movendo o nível de parada para o ponto de equilíbrio

SimpleTrailing - Rastreamento de posições com uma simples arrasto

ArrayZ - Retorna o Z-score de uma série numérica.
ArrayDeleteInt - Exclui o elemento da matriz no índice fornecido. Retorna o tamanho da nova matriz ou -1 se nada puder ser removido.
ArrayDeleteDouble - Exclui o elemento da matriz no índice fornecido. Retorna o tamanho da nova matriz ou -1
se nada puder ser removido.
ArrayDeleteString - Exclui o elemento da matriz no índice fornecido. Retorna o tamanho do novo array, ou -1,
se nada pudesse ser removido.
ArrayInsertDouble - Insere um elemento de matriz no índice fornecido. Retorna o tamanho do novo array.
BubbleSort2 - Executa uma classificação de bolhas nos elementos de uma matriz bidimensional.
GetTypeLastDeleted - Retorna o tipo do último pedido excluído ou -1
iBarLargest - Retorna o índice da maior barra, ou -1.
iBarOfDayCalc - Retorna o número da barra calculada desde o início do dia. A numeração das barras começa a partir de 1 (um)
iBarOfDayReal - Retorna o número real da barra desde o início do dia.
NameDayOfWeek - Retorna o nome do dia da semana
NormalizeLot - Retorna o valor normalizado do lote negociado.
NormalizePrice - Retorna o valor do preço normalizado para o tamanho do tick.
WeekOfMonth - Retorna o número da semana do mês dada a data
ClosePosBySortLots - Fechar posições em ordem de classificação por tamanho de lote.
AddLeadingZero - Adiciona zeros iniciais "0" suficientes à string S para tornar a string S igual ao comprimento K.

toTime - Converte dois/três inteiros em uma string no formato de hora

Página nº 9
StringLower - Retorna uma string minúscula

StringUpper - Retorna uma string em MAIÚSCULAS

StringToArrayDouble - Transferir números reais de string para array

StringToArrayInt - Transferir valores inteiros de string para array

StrSplit - Dividindo uma string em uma matriz de elementos

StrTran - Substituição de Substring

MovingInWL - Movendo o nível de parada para o ponto de equilíbrio

isTradeTimeString - Retorna o sinalizador de ativação de negociação de tempo.

isTradeTimeInt - Retorna o sinalizador de permissão de negociação de tempo.


Adicionalmente:
Todas as funções em um arquivo.
Todas as funções estão na forma de bibliotecas vinculadas.


 //+----------------------------------------------------------------------------+ //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   | //+----------------------------------------------------------------------------+ //|  Версия  : 13.06.2007                                                      | //|  Описание : Установка ордера. Версия функции для тестов на истории.        | //+----------------------------------------------------------------------------+ //|  Параметры:                                                                | //|    sy - наименование инструмента   (NULL или "" - текущий символ)          | //|    op - операция                                                           | //|    ll - лот                                                                | //|    pp - цена                                                               | //|    sl - уровень стоп                                                       | //|    tp - уровень тейк                                                       | //|    mn - Magic Number                                                       | //|    ex - Срок истечения                                                     | //+----------------------------------------------------------------------------+ void SetOrder( string sy, int op, double ll, double pp,                double sl= 0 , double tp= 0 , int mn= 0 , datetime ex= 0 ) {    color clOpen;    int    err, ticket;      if (sy== "" || sy== "0" ) sy= Symbol ();    if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;   ticket= OrderSend (sy, op, ll, pp, Slippage, sl, tp, "" , mn, ex, clOpen);    if (ticket< 0 ) {     err= GetLastError ();      Print ( "Error(" ,err, ") set " ,GetNameOP(op), ": " ,ErrorDescription(err));      Print ( "Ask=" ,Ask, " Bid=" ,Bid, " sy=" ,sy, " ll=" ,ll,            " pp=" ,pp, " sl=" ,sl, " tp=" ,tp, " mn=" ,mn);   } } //+----------------------------------------------------------------------------+

Função ExistOrders().

Retorna o sinalizador de existência do pedido. Ele responderá à pergunta se a ordem está definida ou não. Usando esta função, você pode solicitar qualquer pedido, bem como um mais específico. O filtro de solicitação é configurado usando os parâmetros da função:

  • sy - Impõe uma restrição ao nome da ferramenta. Por padrão, o parâmetro é "" - sem restrições, ou seja, qualquer ferramenta. Se você passar NULL, a seleção de ordens será limitada ao instrumento atual.
  • op - Coloca um limite no tipo de ordem. Por padrão, não há restrição, ou seja, é verificada a presença de um pedido de qualquer tipo. Os valores de parâmetro válidos são -1, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT e OP_SELLSTOP.
  • mn - Impõe um limite ao número de identificação ("mágico") da ordem. Por padrão, não há limite, ou seja, é verificada a presença de um pedido com qualquer número mágico.
  • ot - Impõe um limite no tempo de colocação da ordem. Verificado. para que o pedido seja feito depois do valor desse parâmetro. Por padrão, não há limite, ou seja, é verificada a presença de um pedido com qualquer tempo de configuração.
 //+----------------------------------------------------------------------------+ //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   | //+----------------------------------------------------------------------------+ //|  Версия   : 12.03.2008                                                     | //|  Описание : Возвращает флаг существования ордеров.                         | //+----------------------------------------------------------------------------+ //|  Параметры:                                                                | //|    sy - наименование инструмента   (""   - любой символ,                   | //|                                     NULL - текущий символ)                 | //|    op - операция                   (-1   - любой ордер)                    | //|    mn - MagicNumber                (-1   - любой магик)                    | //|    ot - время открытия             ( 0   - любое время установки)          | //+----------------------------------------------------------------------------+ bool ExistOrders( string sy= "" , int op=- 1 , int mn=- 1 , datetime ot= 0 ) {    int i, k= OrdersTotal (), ty;      if (sy== "0" ) sy= Symbol ();    for (i= 0 ; i<k; i++) {      if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {       ty=OrderType();        if (ty> 1 && ty< 6 ) {          if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || ty==op)) {            if (mn< 0 || OrderMagicNumber()==mn) {              if (ot<=OrderOpenTime()) return (True);           }         }       }     }   }    return (False); }
Полезные функции от KimIV
Полезные функции от KimIV
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 

A função ExistPosições().

Projetado para verificar as compras ou vendas em aberto. Semelhante à função ExistOrders. Por padrão, ele verifica todas as posições: atuais e outros instrumentos. Você pode refinar a seleção com uma combinação de filtros - parâmetros de função:

  • sy - Impõe uma restrição ao nome do instrumento. O parâmetro padrão é "" - sem restrições, ou seja, qualquer instrumento. Se você aprovar o NULL, a seleção de posição será limitada ao instrumento atual.
  • op - coloca uma restrição no tipo de posição (Compra/Venda). Por padrão, não há nenhuma restrição, ou seja, qualquer tipo de posição é verificada. Os valores válidos para este parâmetro são -1, OP_BUY e OP_SELL.
  • mn - Aplica restrição ao número de identificação ("mágico") da posição. Por padrão não há nenhuma restrição, ou seja, a posição com qualquer número mágico é verificada.
  • ot - Aplica restrição no tempo de abertura de posição. É verificado se a posição será aberta mais tarde do que o valor deste parâmetro. Por padrão, não há nenhuma restrição, ou seja, a posição com qualquer tempo aberto é verificada.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

Função OpenPosition() para o testador.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Открытие позиции. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color  clOpen;
  double pp;
  int    err, ticket;
 
  if (sy=="") sy=Symbol();
  if (op==OP_BUY) {
    pp=MarketInfo(sy, MODE_ASK); clOpen=clOpenBuy;
  } else {
    pp=MarketInfo(sy, MODE_BID); clOpen=clOpenSell;
  }
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, 0, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") open ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
 

Função OpenPosition() para on-line.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}
 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
} 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование таймфрейма                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  switch (TimeFrame) {
    case PERIOD_M1:  return("M1");
    case PERIOD_M5:  return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1:  return("H1");
    case PERIOD_H4:  return("H4");
    case PERIOD_D1:  return("Daily");
    case PERIOD_W1:  return("Weekly");
    case PERIOD_MN1: return("Monthly");
    default:         return("UnknownPeriod");
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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");
  }
}
 

Função ModifyOrder().

A função ModifyOrder foi projetada para alterar um ou mais níveis de preços de um pedido pré-selecionado. Aqui uma ordem pendente é entendida como uma ordem Limit ou Stop, assim como uma ordem de Compra ou Venda no mercado, ou seja, uma posição. Usando a função ModifyOrder você pode modificar dois níveis de preço StopLoss e TakeProfit para a posição, enquanto para a ordem pendente o preço de ajuste de Preço Aberto também pode ser alterado. Os níveis de preços modificados são passados para a função ModifyOrder como parâmetros. Se qualquer um dos parâmetros for negativo, o nível de preço correspondente não será alterado.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
      }
    }
  }
}
 

Função DeleteOrders(). Versão do testador.

Função DeleteOrders() destina-se a excluir pedidos pendentes BuyLimit, BuyStop, SellLimit e SellStop. A função DeleteOrders() é universal, ou seja, pode ser usada para excluir todas as ordens pendentes presentes, bem como as específicas que atendam às condições de seleção definidas pelos parâmetros da função:

sy - Nome do instrumento. Como somente o símbolo atual pode ser comercializado no Strategy Tester, este parâmetro não é relevante para a versão do Strategy Tester e só é necessário para a compatibilidade com a versão on-line desta função. É melhor usar os valores "" ou NULL no testador. O valor padrão "" significa qualquer símbolo.
op
- Tipo de operação comercial, tipo de ordem pendente. Um dos cinco valores é possível: -1, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT ou OP_SELLSTOP. O valor padrão de -1 significa qualquer ordem.

mn - MagicNumber, número de identificação de uma ordem pendente. O valor padrão -1 significa qualquer MagicNumber.


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 13.06.2007                                                      |
//| Описание : Удаление ордеров. Версия функции для тестов на истории.         |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//| sy - наименование инструмента   (NULL - текущий символ)                    |
//| op - операция                   ( -1  - любой ордер)                       |
//| mn - MagicNumber                ( -1  - любой магик)                       |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ot;
 
  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
        if (OrderSymbol()==sy && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            OrderDelete(OrderTicket(), clDelete);
          }
        }
      }
    }
  }
}
 

Função DeleteOrders(). Versão on-line.


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 28.11.2006                                                      |
//| Описание : Удаление ордеров                                                |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента   ( ""  - любой символ,                    |
//|                                    NULL - текущий символ)                  |
//|   op - операция                   (  -1 - любой ордер)                     |
//|   mn - MagicNumber                (  -1 - любой магик)                     |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  bool fd;
  int err, i, it, k=OrdersTotal(), ot;
  
  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            for (it=1; it<=NumberOfTry; it++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              fd=OrderDelete(OrderTicket(), clDelete);
              if (fd) {
                if (UseSound) PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                Print("Error(",err,") delete order ",GetNameOP(ot),
                      ": ",ErrorDescription(err),", try ",it);
                Sleep(1000*5);
              }
            }
          }
        }
      }
    }
  }
}
 
//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

Função ExistOrdersByLot().

Devolve uma bandeira para a existência de um pedido com o tamanho de lote especificado. Verdadeiro - a ordem existe (conjunto), Falso - a ordem não existe (não conjunto). Você pode limitar a lista de ordens a serem verificadas usando os parâmetros da função:

  • sy - Nome do instrumento. Se você definir este parâmetro, a função só verificará as ordens do instrumento especificado. NULL significa instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer tipo de pedido.
  • mn - Identificador do pedido (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
  • lo - Tamanho de um lote com uma precisão de duas casas decimais. O valor padrão é 0 - qualquer tamanho de lote.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает флаг существования ордера по размеру лота.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    lo - лот                        ( 0   - любой лот)                      |
//+----------------------------------------------------------------------------+
bool ExistOrdersByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), ot;
  lo=NormalizeDouble(lo, 2);

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (lo<=0 || NormalizeDouble(OrderLots(), 2)==lo) return(True);
          }
        }
      }
    }
  }
  return(False);
}
 

Função GetLotLastOrder().

Devolve o tamanho do lote do último pedido colocado ou -1. Você pode limitar a lista de ordens a serem verificadas usando os parâmetros da função:

  • sy - Nome do instrumento. Se este parâmetro for dado, a função somente verificará as ordens do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 significa qualquer ordem.
  • mn - Identificador do pedido (MagicNumber). O valor padrão -1 significa qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает размер лота последнего выставленного ордера или -1  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
 

Função GetOrderOpenPrice().

Retorna o preço de ajuste do último pedido aberto ou 0. Você pode limitar a lista de pedidos a serem verificados com parâmetros de função:

  • sy - Nome do instrumento. Se este parâmetro for dado, a função somente verificará as ordens do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer ordem.
  • mn - Identificador do pedido (MagicNumber). O valor padrão -1 significa qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает цену установки последнего ордера или 0.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

A função IndexByTicket().

Retorna o índice (número ordinal na lista geral de ordens ou posições abertas) da ordem ou posição no bilhete. Se IndexByTicket() não puder encontrar um pedido ou posição com o bilhete requerido, ele retornará -1. Podemos limitar a lista de ordens ou posições a serem verificadas usando os parâmetros da função:

  • sy - Nome do instrumento. Se você especificar este parâmetro, a função só verificará as ordens e posições do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de ordem ou posição pendente. Valores válidos: OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLL, OP_SELLLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer ordem ou posição.
  • mn - Identificador de uma ordem ou posição (MagicNumber). O valor padrão -1 significa qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket(int ti, string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}