Caratteristiche utili da KimIV - pagina 91

 

La funzione CrossPointOfSections().

Questa funzione calcola le coordinate del punto di intersezione di due segmenti. Ogni segmento è definito da una coppia di coordinate dei suoi punti. Tre array sono passati alla funzione come parametri:

  • x - Matrice di ascissa. Deve contenere quattro elementi: x[0], x[1] - ascisse del primo segmento, x[2], x[3] - ascisse del secondo segmento.
  • y - Un array di ordinate. Dovrebbe contenere quattro elementi: y[0], y[1] - ordinate del primo segmento, y[0], y[1] - ordinate del secondo segmento.
  • t - Matrice di coordinate del punto di intersezione che stai cercando. Dopo la normale esecuzione della funzione, questa matrice conterrà due elementi: t[0] è l'ascissa del punto di incrocio delle due linee e t[1] è l'ordinata dello stesso punto.
  • Il risultato è vero se i segmenti si intersecano, falso se non lo fanno. Se i segmenti sono congruenti, totalmente o parzialmente, la funzione restituirà falso.
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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);
}

Lo script è per i test.

File:
 
Grazie.
 

Buon pomeriggio. Domanda sulle funzioni che restituiscono un flag per chiudere l'ultima posizione ad un take o stop loss.

Funzioni utili da KimIV'.

Funzione isCloseLastPosByTake().
Questa funzione restituisce il flag per chiudere l'ultima posizione del take. La bandiera è su - Vero - TakeProfit è scattato. Flag abbassato - Falso - la posizione è stata chiusa per altri motivi

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

Ieri ho fatto questa domanda sul forum generale. Ma finora nessuna risposta.

Il mio Expert Advisor ha una martingala a 3 fasi. Ogni passo (posizione) ha la sua magia (1,2,3).

Le posizioni sono chiuse da segnali e/o stop.

Anche questo tipo di chiusura è implementato:

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

Risulta che il mio Expert Advisor funziona bene fino a quando l'ultima (la più grande posizione) di un marginale viene chiusa al Take Profit!

Poi, quando la prossima prima posizione (magic 1) viene aperta, viene chiusa immediatamente, perché il flag della funzione isCloseLastPosByTake() rimane impostato su uno (1) !

E così all'infinito. Si apre e si chiude.

Inoltre! Il terminale ricorda questa bandiera e anche una nuova rimozione/installazione dell'EA non aiuta (fino a quando non si cambia magiks).

Ho bisogno di un modo per resettare la funzione isCloseLastPosByTake() dopo che tutte le posizioni sono chiuse.

Mi sono già rigirato il cervello. Non funziona!

Igor !, O chiunque (che può), per favore dimmi come fare e se si può fare a tutti ?




 

La risposta alla mia domanda sembra essere stata trovata. Se siete interessati, è proprio qui.

Una domanda per intenditori".

 
KimIV >> :

Esempi di come usare la funzione ModifyOrder().

Ho deciso di fare i primi esempi che mi sono stati chiesti molte volte. Questa è l'apertura di posizioni in termini di esecuzione degli ordini di mercato Market Watch. È quando non possiamo dare simultaneamente un ordine per aprire una posizione al prezzo di mercato e allegare un ordine pendente ad esso. Un'apertura di questo tipo a Market Watch deve essere eseguita in due fasi: prima si apre una posizione e poi si allega un ordine pendente ad essa, cioè si impostano i livelli di prezzo StopLoss e TakeProfit.

1. Comprare 0,1 lotti del simbolo corrente e impostare uno stop di 30 punti

2. Vendi 0,15 lotti del simbolo corrente e imposta 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);

Una sceneggiatura di lavoro con esempi è inclusa nel trailer.





Buongiorno a Igor e a tutti voi! Ho applicato queste funzioni nel mio EA. Tutto si modifica bene.

Basta che non abbia messo nel mio EA un magik!

Tutte le posizioni si modificano normalmente. Tuttavia -

Non capisco perché ma la funzione OpenPosition() non vede il mago e continua ad aprire posizioni una per una su ogni barra. Ho già rimosso tutte le cose inutili (ho pensato che fosse un mio errore nel codice).

E mettete il numero di posizioni nel commento. È inutile. Quando ci sono posizioni ovvie - il commento stampa zero:


Non riesco a capire perché la funzione non può vedere il mago! Ecco il codice:
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)//флаг сущ.

In allegato il file sorgente di questo codice. Potete dirmi dove ho sbagliato e perché l'EA non vede il magik?

File:
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);
 
Sei consapevole che nella tua versione controlla solo gli ordini di vendita?
L'ho trovato, si inviano solo quattro parametri alla funzione di apertura della posizione, mentre ne servono 6.
 

Sì, grazie a tutti(tmp.0 & Roger)! L'ho riparato e tutto funziona come dovrebbe.

La colpa è della mia disattenzione. Non è affatto la funzione 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);
 

Giocatore, un suggerimento!

Quando si usa OrderCloseBuy - OrderCloseSell, il linguaggio integrato MKueL e il compilatore richiedono due parametri di funzione(biglietti d'ordine - buy e sell). Abbiamo un biglietto per un ordine aperto, ma come possiamo impostare il secondo? O forse non ho capito qualcosa - l'autoapprendimento della lingua non ha scritto nulla su questa funzione e non ha alcun esempio.

Grazie in anticipo!

 

Ed ecco un'altra domanda per Igor.

Avete creato una funzione separata personalizzata (o altra) per capovolgere la posizione di acquisto-vendita e viceversa, senza il solito OrderClose-OrderSend?