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);}
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 ?
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:
externint Magic =7771;externint StopLoss =200;externint TakeProfit_Sell =200;externdouble Lots_1 =0.01;//размер лота//--------------------------------------------------------------------+externstring _P_Performance ="- Параметры открытия позиций ";externbool UseSound = True;//Использовать звуковой сигналexternstring 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;staticint 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?
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.
Avete creato una funzione separata personalizzata (o altra) per capovolgere la posizione di acquisto-vendita e viceversa, senza il solito OrderClose-OrderSend?
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:
Lo script è per i test.
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:
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".
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
Una sceneggiatura di lavoro con esempi è inclusa nel trailer.
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:
In allegato il file sorgente di questo codice. Potete dirmi dove ho sbagliato e perché l'EA non vede il magik?
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().
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?