KimIV의 유용한 기능 - 페이지 91

 

CrossPointOfSections() 함수.

이 함수는 두 선분의 교차점 좌표를 계산합니다. 각 세그먼트는 점의 좌표 쌍으로 정의됩니다. 세 개의 배열이 매개변수로 함수에 전달됩니다.

  • x - 가로 좌표의 배열. 4개의 요소를 포함해야 합니다. x[0] , x[1] - 첫 번째 세그먼트의 가로 좌표, x[2] , x[3] - 두 번째 세그먼트의 가로 좌표.
  • y - 좌표 배열. 4개의 요소를 포함해야 합니다. y[0] , y[1] - 첫 번째 세그먼트의 좌표, y[0] , y[1] - 두 번째 세그먼트의 좌표.
  • t - 원하는 교차점에 대한 좌표 배열. 함수가 정상적으로 실행된 후 이 배열에는 두 개의 요소가 포함됩니다. t[0] - 두 선의 원하는 교차점의 가로 좌표 및 t[1] - 동일한 점의 세로 좌표.
  • 세그먼트가 교차하면 결과는 true 이고, 그렇지 않으면 false 입니다. 세그먼트가 완전히 또는 부분적으로 일치하면 함수는 false 를 반환합니다.
 //+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    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 ) ;
}

테스트용 스크립트.

파일:
 
고맙습니다.
 

안녕하세요. 테이크 또는 스톱 로스로 마지막 위치를 닫기 위한 플래그를 반환하는 함수에 대한 질문입니다.

'김IV의 유용한 기능'

isCloseLastPosByTake() 함수.
이 함수는 take로 마지막 위치를 닫기 위한 플래그를 반환합니다. 플래그가 제기됨 - True - TakeProfit이 작동했습니다. 플래그 생략 - False - 다른 이유로 포지션이 마감됨

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

어제 일반 포럼에서 이미 질문을 제기했습니다. 그러나 답은 아직 찾지 못했습니다.

MY EA에는 3단계 마틴게일이 있습니다. 각 단계(위치)에는 마법(1,2,3)이 있습니다.

위치는 신호 및/또는 정지로 닫힙니다.

다음 클로저도 제공됩니다.

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

내 고문은 마티게일의 마지막(가장 큰 위치) 단계가 이익을 취하여 닫힐 때까지 잘 작동하는 것으로 나타났습니다 !

그 후 다음 첫 번째 위치(Magic-1)가 열리면 즉시 닫힙니다. 함수 isCloseLastPosByTake() 의 함수 플래그는 1과 동일하게 유지되었습니다!

등등 무한대로. 열리고 닫힙니다.

뿐만 아니라! 터미널은 이 플래그를 기억하고 어드바이저를 새로 제거/설치해도 도움이 되지 않습니다(마법을 변경할 때까지).

모든 위치를 닫은 후 어떤 식으로든 isCloseLastPosByTake() 함수를 재설정해야 합니다.

나는 이미 내 두뇌를 뒤집어 놓았다. 작동하지 않습니다!

Igor!, 또는 누구든지(할 수 있는 사람), pl. 그것을하는 방법을 알려주고 전혀 할 수 있습니까?

 

제 질문에 답이 있었던 것 같습니다. 관심 있으신 분들은 여기

전문가에게 '질문'

 
KimIV >> :

ModifyOrder() 함수 사용의 예.

가장 먼저 나는 이미 반복적으로 질문을 받은 예를 제시하기로 결정했습니다. 이것은 Market Watch 거래 주문의 시장 실행 조건에서 포지션을 여는 것입니다. 이는 시장 가격으로 포지션을 오픈하는 주문을 하는 동시에 보류 중인 주문을 첨부하는 것이 불가능한 경우입니다. Market Watch 조건에서 이러한 개시는 두 단계로 수행되어야 합니다. 먼저 포지션을 개설한 다음 보류 중인 주문을 첨부합니다. 즉, StopLoss 및 TakeProfit 가격 수준을 설정합니다.

1. 현재 상품의 0.1랏을 매수하고 30포인트의 스탑을 설정합니다.

2. 현재 상품의 0.15랏을 매도하고 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 ) ;

예고편에서 예제가 있는 작업 스크립트.





좋은 아침 Igor와 참석한 모든 분들! 내 Expert Advisor에서 이러한 기능을 적용했습니다. 모든 것이 잘 수정됩니다.

내 EA에 마법을 넣을 때까지!

모든 위치가 정상적으로 수정됩니다. 하지만 -

이유는 분명하지 않지만 OpenPosition() 함수-마치 마술사를 보지 않고 각 막대에서 차례로 위치를 끝없이 계속 엽니다. 나는 이미 불필요한 모든 것을 제거했습니다(나는 그것이 코드에서 내 실수라고 생각했습니다).

그리고 댓글에 자리수를 넣었습니다. 쓸모 없는. 위치가 분명하면 주석이 0으로 표시됩니다.


함수가 마술을 보지 못하는 이유를 알 수 없습니다! 코드는 다음과 같습니다.
 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 ) //флаг сущ.

첨부 파일은 이 코드의 소스 파일입니다. 제발. 내가 어디서 실수를 했고 왜 고문이 마법을 보지 못하는지 말해줘?

파일:
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);
 
귀하의 버전에서는 판매 주문 만 확인한다는 사실을 알고 계십니까?
포지션 개시 함수에 4개의 매개변수만 보내는 것을 발견했지만 6개가 필요합니다.
 

네, 감사합니다( tmp.0 & Roger )! 나는 그것을 고쳤고 모든 것이 제대로 작동했습니다.

내 부주의 탓이다. 그리고 전혀 기능이 아닙니다 - 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 ) ;
 

게임, 말해!

OrderCloseBuy - OrderCloseSell을 사용할 때 내장 MCule 언어와 컴파일러에는 두 가지 기능 매개변수( 주문 티켓 - 구매 및 판매)가 필요합니다. 오픈 오더 티켓이 하나 있는데 두 번째 티켓은 어떻게 설정하나요? 또는 내가 뭔가를 이해하지 못했습니다. 언어 튜토리얼은 이 기능에 대해 아무 말도 하지 않으며 예제도 없습니다.

미리 감사드립니다!

 

그리고 여기 Igor에 대한 또 다른 질문이 있습니다.

일반적인 OrderClose - OrderSend 없이 구매 대 판매 위치 를 반전하거나 그 반대로 하는 별도의 사용자 정의(또는 기타) 기능을 생성했습니까?