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

 

A função CrossPointOfSections().

Esta função calcula as coordenadas do ponto de intersecção de dois segmentos. Cada segmento é definido por um par de suas coordenadas de ponto. Três arrays são passados para a função como parâmetros:

  • x - matriz Abscissa. Deve conter quatro elementos: x[0], x[1] - abcissas do primeiro segmento, x[2], x[3] - abcissas do segundo segmento.
  • y - Um conjunto de ordenações. Deve conter quatro elementos: y[0], y[1] - ordenadas do primeiro segmento, y[0], y[1] - ordenadas do segundo segmento.
  • t - Conjunto de coordenadas do ponto de interseção que você está procurando. Após a execução normal da função, esta matriz conterá dois elementos: t[0] é a abcissa do ponto de cruzamento das duas linhas e t[1] é a ordenada do mesmo ponto.
  • O resultado é verdadeiro se os segmentos se cruzarem, falso se não se cruzarem. Se os segmentos forem congruentes, total ou parcialmente, a função retornará falsa.
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив абсцисс              x[0], x[1] - первый отрезок             |
//|                                    x[2], x[3] - второй отрезок             |
//|    y - массив ординат              y[0], y[1] - первый отрезок             |
//|                                    y[0], y[1] - второй отрезок             |
//|    t - массив искомых координат    t[0]       - абсцисса точки пересечения |
//|                                    t[1]       - ордината точки пересечения |
//|    результат                       true если отрезки пересекаются          |
//|                                    false если нет                          |
//|    примечание                      если отрезки не пересекаются, то в мас- |
//|                                    сив t[] передается точка пересечения    |
//|                                    прямых, на которых лежат отрезки        |
//+----------------------------------------------------------------------------+

bool CrossPointOfSections(double& x[], double& y[], double& t[]) 
{
   double z=( y[3]- y[2])*( x[1]- x[0])-( y[1]- y[0])*( x[3]- x[2]);
   ArrayResize( t, 2);
   ArrayInitialize( t, 0.0);

   if ( z==0) 
   {
      Print("CrossPointOfSections(): Не удалось найти точку пересечения!");
      return (false);
   }

   double xy1= x[1]* y[0]- x[0]* y[1];
   double xy2= x[3]* y[2]- x[2]* y[3];
   t[0]=NormalizeDouble(( xy1*( x[3]- x[2])- xy2*( x[1]- x[0]))/ z, 0);
   t[1]=( xy1*( y[3]- y[2])- xy2*( y[1]- y[0]))/ z;
   
   if (( t[0] - x[0])*( t[0] - x[1]) > 0 || ( t[1] - y[0])*( t[1] - y[1]) > 0) return (false);
   if (( t[0] - x[2])*( t[0] - x[3]) > 0 || ( t[1] - y[2])*( t[1] - y[3]) > 0) return (false);

   return (true);
}

O roteiro é para testes.

Arquivos anexados:
 
Obrigado.
 

Boa tarde. Pergunta sobre funções que devolvem uma bandeira para fechar a última posição em um take ou stop loss.

Funções úteis da KimIV".

Função éCloseLastPosByTake().
Esta função retorna a bandeira para fechar a última posição no take. A bandeira está hasteada - Verdadeiro - TakeProfit foi acionada. Bandeira arriada - Falsa - a posição foi fechada por outro motivo

//---------------------------------------------------------------

Ontem eu fiz esta pergunta no fórum geral. Mas, até agora, nenhuma resposta.

Meu consultor especializado tem um martingale em 3 etapas. Cada passo (posição) tem seu próprio magik (1,2,3).

As posições são fechadas por sinais e/ou paradas.

Este tipo de fechamento também é implementado:

if ( isCloseLastPosByStop(NULL, OP_BUY, Magic_3)) //если посл. позиция 
//закрылась по тейкпрофиту, - то закрываем все позиции
 ClosePosFirstProfit(NULL,OP_BUY, -1);   

Acontece que meu consultor especializado trabalha bem desde que a última (maior posição) de uma etapa de martigail não seja fechada na Take Profit!

Então quando a próxima primeira posição (mágica 1) é aberta, ela é fechada imediatamente, porque a bandeira da função isCloseLastPosByTake() permanece ajustada em uma (1) !

E assim até o infinito. Abre e fecha.

Além disso! O terminal lembra-se desta bandeira e até mesmo a nova remoção/instalação da EA não ajuda (até que você troque de revista magnética).

Eu preciso de alguma maneira de reiniciar a função isCloseLastPosByTake() depois que todas as posições forem fechadas.

Eu já torci meu cérebro do avesso. Não vai funcionar!

Igor !, ou quem (quem puder), por favor, me diga como fazer e se você pode fazer isso ?




 

A resposta à minha pergunta parece ter sido encontrada. Se você estiver interessado, está bem aqui.

Uma pergunta para os conhecedores".

 
KimIV >> :

Exemplos de como usar a função ModifyOrder().

Decidi dar os primeiros exemplos que já me foram perguntados muitas vezes. Esta é a abertura de posições em termos de execução de ordens de mercado Market Watch. É quando não podemos simultaneamente dar uma ordem para abrir uma posição ao preço de mercado e anexar uma ordem pendente a ela. Tal abertura na Market Watch deve ser realizada em duas etapas: primeiro, abrimos uma posição, e depois anexamos uma ordem pendente a ela, ou seja, estabelecemos níveis de preços StopLoss e TakeProfit.

1. Comprar 0,1 lote do símbolo atual e definir uma parada de 30 pontos

2. Vender 0,15 lote do símbolo de corrente e conjunto SL=45, TP=99

int ti= OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect( ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);

Um roteiro de trabalho com exemplos está incluído no trailer.





Bom dia a Igor e a todos vocês! Eu apliquei estas funções em minha EA. Tudo está modificando a multa.

Desde que eu não tenha colocado no meu EA um magik !

Todas as posições se modificam normalmente. No entanto -

Não entendo por que, mas a função OpenPosition() não vê o mágico e continua abrindo posições uma a uma em cada bar. Eu já removi todas as coisas desnecessárias (pensei que era meu erro no código).

E coloque o número de posições no comentário. É inútil. Quando há posições óbvias - as impressões dos comentários são zero:


Não consigo entender porque a função não consegue ver o mágico! Aqui está o código:
extern int        Magic           = 7771;
extern int        StopLoss        =200;
extern int        TakeProfit_Sell =200;
extern double     Lots_1          = 0.01;//размер лота
//--------------------------------------------------------------------+
extern string _P_Performance = "- Параметры открытия  позиций ";
extern bool       UseSound      = True;        //Использовать звуковой сигнал
extern string     NameFileSound = "expert.wav";//Наименование зву. файла откр.
color  clOpenBuy     = Blue;      // Цвет значка открытия покупки
color  clOpenSell    = Red;       // Цвет значка открытия продажи
color  clModifyBuy   = Aqua;      // Цвет значка модификации покупки
color  clModifySell  = Tomato;    // Цвет значка модификации продажи
 int    Slippage      = 10;       // Проскальзывание цены
 int    NumberOfTry   = 10;       // Количество попыток
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
//-- Подключаемые модули --

#include <stderror.mqh>
#include <stdlib.mqh>
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
bool   gbDisabled    = False;    // Флаг блокировки советника
double SL, TP;
int ti;
static int prevtime = 0; 

//------------------------------------------------------------
int start() {
Comment ("Количество откр. позиций = ", NumberOfPositions(NULL,OP_SELL, Magic));
if(Time[0] == prevtime)   return(0);//ждём появления нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

//XXXXXXXXXXXXXXXXXXX ОТКРЫТИЕ ПОЗИЦИЙ ХХХХХХХХХХХХХХ

if( NumberOfPositions(NULL,OP_SELL, Magic)<1){//если нет открытых селл-
// позиций
SL=0; TP=0;// задаем стопы
if( StopLoss>0)   SL=Bid+Point* StopLoss;
if( TakeProfit_Sell>0) TP=Bid-Point* TakeProfit_Sell; 
//Открываем позицию селл  
 ti= OpenPosition(NULL, OP_SELL, Lots_1, Magic);
if (OrderSelect( ti, SELECT_BY_TICKET))
  ModifyOrder(-1, SL, TP, clModifySell);
 } 
 return (0);
 //-----------------Конец функции int start()-------------------------
}
// Пользовательские функции жжжжжжжжжжжжжжжжжжжжжжжжж
//Здесь только названия. Полный код ф-й - ниже в аттаче
void Message(string m) //вывод сообщ в коммент и принт
int NumberOfPositions(string sy="", int op=-1, int mn=-1)//кол-во позиций
string GetNameOP(int op)//торг. операция
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0)
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)
string GetNameTF(int TimeFrame=0) //таймфрейм
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0)//флаг сущ.

Em anexo está o arquivo fonte deste código. Você pode me dizer onde eu cometi um erro e por que a EA não vê o magik?

Arquivos anexados:
exp.sell.rar  4 kb
 
if( StopLoss>0)   SL=Bid+Point* StopLoss;
if( TakeProfit_Sell>0) TP=Bid-Point* TakeProfit_Sell; 
//Открываем позицию селл  
 //ti=OpenPosition(NULL, OP_SELL, Lots_1,Magic);  Ваш маджик шел в качестве стоп-лосса
 ti= OpenPosition(NULL, OP_SELL, Lots_1, SL, TP, Magic);
 
Você está ciente de que em sua versão ela apenas verifica os pedidos de venda?
Encontrei, você só envia quatro parâmetros para a função de abertura de posição, enquanto você precisa de 6.
 

Sim, obrigado a todos vocês(tmp.0 & Roger)! Fixou-o e tudo está funcionando como deveria.

Minha desatenção é a culpada. Não é de todo a função OpenPosition().

SL=0; TP=0;
if( StopLoss>0)   SL=Bid+Point* StopLoss;
if( TakeProfit>0) TP=Bid-Point* TakeProfit;   
ti= OpenPosition(NULL, OP_SELL, Lots,0,0, Magic);
if (OrderSelect( ti, SELECT_BY_TICKET))
  ModifyOrder(-1, SL, TP, clModifySell);
 

Jogador, uma dica!

Ao utilizar OrderCloseBuy - OrderCloseSell, a linguagem MKueL embutida e o compilador requer dois parâmetros de função(bilhetes de pedido - comprar e vender). Temos um bilhete para um pedido aberto, mas como podemos definir o segundo? Ou talvez eu não tenha entendido algo - o auto-estudo da língua não escreveu nada sobre esta função e não tem nenhum exemplo.

Agradecemos antecipadamente!

 

E aqui está outra pergunta para Igor.

Você criou uma função personalizada separada (ou outra) para inverter a posição de compra-venda e vice-versa, sem o habitual OrderClose-OrderSend?