[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 227

 

친애하는 동료 전문가 여러분, 여러분의 도움이 필요합니다. EA에서 다른 시간대의 현재 추세와 다가오는 반전에 대한 알림을 화면 상단 모서리에 표시하는 기능을 만들고 싶습니다. 이를 위해 LinearRegression 및 Diverg 함수를 사용합니다. 다만, 댓글 기능을 사용해 본 적이 없어서 어디에서 실수를 했는지 알 수가 없습니다. 일반적으로 아래 코드의 결과 화면에는 "Trend W = Down"이라는 문구만 표시되지만 다른 모든 TF에 대해서도 정보가 표시되었으면 합니다.

무효 UPDN()
{
if(LinearRegression(Symbol(), LR_TFr_1, 0, Diver_Per_H1, 0) < 0) Comment("Trend H1 = Up");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)<0) Comment("...!H1으로 반전 = Down");
if(LinearRegression(Symbol(), LR_TFr_2, 0, Diver_Per_H4, 0) < 0) Comment("Trend H4 = Up");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)<0) Comment("...!H4로 반전 = Down");
if(LinearRegression(Symbol(), LR_TFr_3, 0, Diver_Per_D1, 0) < 0) Comment("트렌드 D1 = Up");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)<0) Comment("...!D1으로 반전 = 다운");
if(LinearRegression(Symbol(), LR_TFr_4, 0, Diver_Per_W, 0) < 0) Comment("Trend W = Up");
if(Diverg(LR_TFr_4,0,Diver_Per_W)<0) Comment("...!W로 전환 = Down");

if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) > 0) Comment("Trend H1 = Down");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)>0) Comment("...!H1으로 반전 = Up");
if(LinearRegression(Symbol(), LR_TFr_2, 0, Diver_Per_H4, 0) > 0) Comment("Trend H4 = Down");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)>0) Comment("...!H4로 반전 = Up");
if(LinearRegression(Symbol(), LR_TFr_3, 0, Diver_Per_D1, 0) > 0) Comment("추세 D1 = 아래로");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)>0) Comment("...!D1으로 반전 = Up");
if(LinearRegression(Symbol(), LR_TFr_4, 0, Diver_Per_W, 0) > 0) Comment("Trend W = Down");
if(Diverg(LR_TFr_4,0,Diver_Per_W)>0) Comment("...!W로 회전 = Up");
반환(0);
}

 
Optim :

친애하는 동료 전문가 여러분, 여러분의 도움이 필요합니다. EA에서 다른 시간대의 현재 추세와 다가오는 반전에 대한 알림을 화면 상단 모서리에 표시하는 기능을 만들고 싶습니다. 이를 위해 LinearRegression 및 Diverg 함수를 사용합니다. 다만, 댓글 기능을 사용해 본 적이 없어서 어디에서 실수를 했는지 알 수가 없습니다. 일반적으로 아래 코드의 결과 화면에는 "Trend W = Down"이라는 문구만 표시되지만 다른 모든 TF에 대해서도 정보가 표시되었으면 합니다.

무효 UPDN()
{
if(LinearRegression(Symbol(), LR_TFr_1, 0, Diver_Per_H1, 0) < 0) Comment("Trend H1 = Up");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)<0) Comment("...!H1으로 반전 = Down");
if(LinearRegression(Symbol(), LR_TFr_2, 0, Diver_Per_H4, 0) < 0) Comment("Trend H4 = Up");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)<0) Comment("...!H4로 반전 = Down");
if(LinearRegression(Symbol(), LR_TFr_3, 0, Diver_Per_D1, 0) < 0) Comment("트렌드 D1 = Up");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)<0) Comment("...!D1으로 반전 = 다운");
if(LinearRegression(Symbol(), LR_TFr_4, 0, Diver_Per_W, 0) < 0) Comment("Trend W = Up");
if(Diverg(LR_TFr_4,0,Diver_Per_W)<0) Comment("...!W로 전환 = Down");

if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) > 0) Comment("Trend H1 = Down");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)>0) Comment("...!H1으로 반전 = Up");
if(LinearRegression(Symbol(), LR_TFr_2, 0, Diver_Per_H4, 0) > 0) Comment("Trend H4 = Down");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)>0) Comment("...!H4로 반전 = Up");
if(LinearRegression(Symbol(), LR_TFr_3, 0, Diver_Per_D1, 0) > 0) Comment("추세 D1 = 아래로");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)>0) Comment("...!D1으로 반전 = Up");
if(LinearRegression(Symbol(), LR_TFr_4, 0, Diver_Per_W, 0) > 0) Comment("Trend W = Down");
if(Diverg(LR_TFr_4,0,Diver_Per_W)>0) Comment("...!W = Up");
리턴(0);
}


무효 주석 ( ...)
이 함수는 차트의 왼쪽 상단 모서리에 사용자 정의 설명을 표시합니다. 매개변수는 모든 유형이 될 수 있습니다. 매개변수의 수는 64개를 초과할 수 없습니다.

배열은 Comment() 함수에 전달할 수 없습니다. 배열은 요소별로 인쇄되어야 합니다.

더블 데이터는 도트 뒤에 소수점 4자리로 출력됩니다. 숫자를 더 정확하게 표시하려면 DoubleToStr() 함수를 사용해야 합니다.
bool, datetime 및 색상 유형은 숫자로 인쇄됩니다.
날짜/시간 데이터를 문자열로 출력하려면 TimeToStr() 함수를 사용하십시오.

줄 바꿈 문자 "\n" 또는 "\r\n"을 사용하여 출력 정보를 여러 줄로 구분할 수 있습니다.
Alert()Print() 함수 도 참조하십시오 .
옵션:
... - 쉼표로 구분된 모든 값.
예시:
 이중 free=AccountFreeMargin();
  Comment("계정 여유 마진은 ",DoubleToStr(free,2),"\n","현재 시간은 ",TimeToStr(TimeCurrent()));
 
질문하기 전에 최소한 문서를 읽으십시오. 답의 절반은 이미 있습니다.
 

고맙습니다. 이해합니다. 각 TF에 대해 LinearRegression 및 Diverg 기능을 수행한 결과를 기반으로 변수를 입력한 다음 여러 줄에 한 주석으로 표시해야 합니다.

 
Optim :

고맙습니다. 이해합니다. 각 TF에 대해 LinearRegression 및 Diverg 기능을 수행한 결과를 기반으로 변수를 입력한 다음 여러 줄에 한 주석으로 표시해야 합니다.


라인의 길이 에만 제한이 있습니다. Alexander Pak의 기능을 사용할 수 있습니다. 찾을 수 없다면 내가 직접 찾아볼게
 

신사 숙녀 여러분!

참조로 배열을 전달하는 방법에 대해 질문이 있습니다.

알고리즘 구성표는 다음과 같습니다.

한 라이브러리에서 다른 라이브러리로 배열을 참조로 전달합니다.

거기에서 내장 함수를 통해 복사합니다.

배열 복사.

또한 참조로 전달된 배열은 이미 사용 중입니다.

첫 번째 모듈에서.

그러나 어떤 이유로 오류가 발생하며 항상 그런 것은 아닙니다.

저것들. 복사가 발생하는 경우도 있고 발생하지 않는 경우도 있습니다.

이유는 무엇입니까?

로그 항목은 다음과 같습니다.

21:07:12 오픈 히스토리 CADCHF,H1:

ArrayCopy 기능에 대해 호환되는 2개의 어레이 범위 (0 및 4)

우리는 모듈을 연결합니다

복사

 
Roger :
내 예를 잘못 복사했기 때문입니다. i와 k가 어디에 있는지 주의 깊게 살펴보십시오.

귀하의 코드에 따라 코드가 수정되었습니다.
테스트하는 동안 첫 번째 틱, 다섯 번째 - 다음 틱에 배치 순서대로 4개의 주문이 마감되었습니다. 여기에 다른 문제가 있을 수 있습니다. 반복적으로 테스트했습니다.
프로그램 코드와 테스터 로그의 항목이 제공됩니다.
감사합니다. 쉬르킨

Код программы.
//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link       ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn= 357 ; //Magic number
int i; //Показатель счётчика итераций
double PriTP; //TP серии
int Tick; //Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend ( Symbol (),OP_BUY, 0.5 ,Ask, 0 , NormalizeDouble (Bid- 35 * Point , Digits ),
NormalizeDouble (Ask+ 35 * Point , Digits ), NULL ,Mn, 0 , CLR_NONE ); //OP_BUY
OrderSend ( Symbol (),OP_BUY, 1 ,Ask, 0 , NormalizeDouble (Bid- 25 * Point , Digits ),
NormalizeDouble (Ask+ 25 * Point , Digits ), NULL ,Mn, 0 , CLR_NONE ); //OP_BUY
OrderSend ( Symbol (),OP_BUY, 1.5 ,Ask, 0 , NormalizeDouble (Bid- 15 * Point , Digits ),
NormalizeDouble (Ask+ 15 * Point , Digits ), NULL ,Mn, 0 , CLR_NONE ); //OP_BUY
OrderSend ( Symbol (),OP_BUY, 2.5 ,Ask, 0 , NormalizeDouble (Bid- 15 * Point , Digits ),
NormalizeDouble (Ask+ 15 * Point , Digits ), NULL ,Mn, 0 , CLR_NONE ); //OP_BUY
OrderSend ( Symbol (),OP_BUY, 3.5 ,Ask, 0 , NormalizeDouble (Bid- 15 * Point , Digits ),
NormalizeDouble (Ask+ 15 * Point , Digits ), NULL ,Mn, 0 , CLR_NONE ); //OP_BUY
OrderSend ( Symbol (),OP_BUYLIMIT, 1 , NormalizeDouble (Ask- 15 * Point , Digits ), 0 ,
NormalizeDouble (Bid- 40 * Point , Digits ), NormalizeDouble (Ask+ 25 * Point , Digits ),
NULL ,Mn, 0 , CLR_NONE ); //OP_BUYLIMIT
OrderSend ( Symbol (),OP_SELLSTOP, 3 , NormalizeDouble (Ask- 30 * Point , Digits ), 0 ,
NormalizeDouble (Bid+ 15 * Point , Digits ), NormalizeDouble (Ask- 75 * Point , Digits ),
NULL ,Mn, 0 , CLR_NONE ); //OP_SELLSTOP
//----
   PriTP=Bid; //PriTP
   Print ( "Кс0:" , " OrdersTotal=" , OrdersTotal ()); //Сообщение
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++; //Tick
//   Print("Кс0:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
//   for(i=OrdersTotal()-1; i>=0; i--)//
   for (i= 0 , int k= 0 ; i< OrdersTotal ();i++,k++) //
   {
   Print ( "Кс1:" , " Tick=" ,Tick, " i=" ,i, " k=" ,k); //Сообщение
   if ( OrderSelect (k,SELECT_BY_POS,MODE_TRADES)== true ) //Выбор ордера k
    {
   if (OrderSymbol()== Symbol ()) //Символ
     {
   if (OrderMagicNumber()==Mn) //Идентификационное число
      {
   if (OrderType()==OP_BUY && OrderTakeProfit()>PriTP) //Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid, 0 , CLR_NONE ); //Закрытие позиции
   k--; //?
       } //Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      } //Закрыто if(OrderMagicNumber()==Mn)
     } //Закрыто if(OrderSymbol()==Symbol()
    } //Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   } //Закрыто for(i=0, int k=0; i<OrdersTotal();i++,k++)
/*   
   for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс1:"," Tick=",Tick," i=",i," k=",k);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;//Зачем сначала прибавлять и тут же убавлять ???
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
*/    
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+ 
Записи в журнале тестера.
2013.03 . 18 13 : 58 : 21      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 4 i= 1 k= 1
2013.03 . 18 13 : 58 : 21      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 4 i= 0 k= 0
2013.03 . 18 13 : 57 : 57      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 3 i= 1 k= 1
2013.03 . 18 13 : 57 : 57      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 3 i= 0 k= 0
2013.03 . 18 13 : 57 : 33      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 2 i= 1 k= 0
2013.03 . 18 13 : 57 : 33      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: close # 5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3394
2013.03 . 18 13 : 57 : 33      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick = 2 i= 0 k= 0
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: close # 4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 1 i= 3 k= 0
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: close # 3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 1 i= 2 k= 0
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: close # 2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 1 i= 1 k= 0
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: close # 1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 1 : Tick= 1 i= 0 k= 0
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: Êñ 0 : OrdersTotal = 7
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: open # 7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: open # 6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: open # 5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: open # 4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: open # 3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: open # 2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03 . 18 13 : 57 : 09      2013.02 . 11 12 : 15   Poligon1 EURUSD,M15: open # 1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03 . 18 13 : 57 : 09      Poligon1 test started
2013.03 . 18 13 : 57 : 02      Poligon1 EURUSD,M15: loaded successfully
 
프로그램 실행 자원의 비용을 줄이는 측면에서 변수의 유형(int, double 등)을 선언하는 것이 더 나은 곳은 어디입니까? 예. int i는 전역 수준에서 선언하거나 int start() ... in for (int i=OrdersTotal()-1; i>=0; i--) ... 선언할 수 있습니다. 각 틱 에 대해 extern 매개변수 직후에 전역 수준에서 한 번보다 더 비쌉니다. 아니면 자원 집약도의 차이가 동일한가요?
 
Zhunko :
시작을 반복해야 합니다. 루프 내부에서 작업합니다. 그곳에서는 모든 것이 가능합니다.

조금 다릅니다. 연결이 끊어지면 로그에 "Ping failed"라고 기록합니다. 기능이 있음을 의미하지만 어떤 이유로 문서화되지 않았습니다.
루프가 실행되면 CPU와 메모리의 부하가 얼마나 증가합니까?

 
Dimka-novitsek :

좋은 저녁이에요! 죄송합니다. 해결되지 않은 문제로 돌아가고 싶습니다.

'구매' - 호환되지 않는 유형 D:\TeleTRADE\experts\pure variant.mq4 (102, 53)

'판매' - 호환되지 않는 유형 D:\TeleTRADE\experts\pure variant.mq4 (102, 79)


 if (!Pishem&&PozyProstavleny){SaveArray(FileBuy, Buy); SaveArray(FileSell, Sell); Pishem= 1 ;}

이 줄은 컴파일되지 않습니다.