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

 
paladin80 :
내 경험상 오류를 찾는 가장 효과적인 방법은 오류 번호와 함께 주석에 메시지를 표시한 다음 EA를 시각적으로 실행하는 것입니다. 처음에는 많은 시간이 걸리지만 나중에는 실수 없이 하는 법을 빠르게 배웁니다. 또한 /* ... */를 사용하여 코드의 일부를 제외하면 어드바이저의 동작이 어떻게 변경되는지 확인할 수 있습니다.
나도 똑같이 한다))
 
alsu :
당신이 옳았다. 또한 상자에서 값을 얻었을 때 유형은 double이지만 결과를 int 유형의 변수에 쓰라는 명령이 주어지면 컴파일러는 값을 입력하는 데 필요한 모든 작업을 자동으로 수행합니다. 새 상자.


마지막으로 내가 모든 것을 올바르게 이해했는지 확인하려면 마지막 단락에 대한 내 생각을 확인하십시오 ... 따라서 위에서 이미 언급 한 전문가를 불러 봅시다.

 //--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int     Experts;                                 // Колич. экспертов
double Depo= 10000.0 ,                             // Заданный депозит
       Persent= 30 ,                               // Заданный процент     
       Money;                                   // Искомые средства
string Quantity= "GV_Quantity" ;                   // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                       // Спец. функция init
  {
   Experts= GlobalVariableGet (Quantity);         // Получим тек. знач.
   Experts=Experts+ 1 ;                           // Колич. экспертов
   GlobalVariableSet (Quantity, Experts);         // Новое значение
   Money=Depo*Persent/ 100 /Experts;               // Средства для эксп.
   Alert ( "Для эксперта в окне " , Symbol (), " выделено " ,Money);
   return ;                                       // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet (Quantity); // Новое колич. эксп.
   if (Experts!=New_Experts)                     // Если изменилось
     {
      Experts=New_Experts;                       // Теперь текущ. такое
      Money=Depo*Persent/ 100 /Experts;           // Новое знач. средств 
       Alert ( "Новое значение для эксперта " , Symbol (), ": " ,Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return ;                                       // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                     // Спец. ф-ия deinit
  {
   if (Experts == 1 )                             // Если эксперт один..
       GlobalVariableDel (Quantity);               //..удаляем GV-перемен
   else                                          // А иначе..
       GlobalVariableSet (Quantity, Experts- 1 );   //..уменьшаем на 1
   Alert ( "Эксперт выгружен из окна " , Symbol ()); // Сообщ. о выгрузке
   return ;                                       // Выход из deinit()
  }
//--------------------------------------------------------------------

그런 다음 줄에서 :

Experts= GlobalVariableGet (Quantity);         // Получим тек. знач.

정수 유형 Expert의 변수를 "GV-변수" 상자에 저장하여 (이중 유형으로 변환하여) 저장합니다. 그런 다음 (가상의 가정) Expert Advisor에 줄이 있을 경우

 int New_Experts=Experts;

그러면 int 유형의 변수에 결과를 쓰라는 명령이 주어졌음을 의미합니다. 이 경우 컴파일러는 다음을 수행합니다.

* 더블 타입의 Expert 변수 값을 박스에서 꺼내고,

* Experts 변수의 값에 필요한 변경을 수행합니다.

* 이 값을 New_Experts 변수에 할당하고...

* "int" 상자에 New_Experts 변수의 값을 넣습니다.

저것. 변수 유형 - 일부 값의 외부 래퍼/패키징 외에는 아무것도 없습니까? 따라서 GV 변수는 문자열 유형일 수 없습니다. 다운캐스팅은 숫자 값에만 허용되며 문자열은 숫자로 변환되지 않습니다 .

그래서?

귀하의 응답에 미리 감사드립니다

 
Stells :
무엇이 잘못 되었습니까 (f=1;f<Bars;f++)
{
가격1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT);
가격2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT);
스프레드 = 가격1 - 가격2;
Print("가격1="+가격1, "가격2="+가격2);
if (확산==0){t=f; 부서지다;}
}
가격12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT);
가격22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT);
스프레드2 = 가격12 - 가격22;


if (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { 거래 열기 }


스프레드가 0인 막대를 수정하고 스프레드를 제어하고 싶습니다.

if( MathAbs (Spread)<eps) { ........ } 조건을 만족하는 점이 발견되었는지 여부와 같이 결과도 제어해야 합니다. IMHO, 예를 들어 다음과 같이 별도의 기능을 발행하는 것이 좋습니다.

 int GetBarNumWithZerroDist( string Smbl1, string Smbl2, double K, double eps= 0.00001 )
{
int i= 1 ;
double Smb1Cl0 = NrmalizeDouble( iClose (Smbl1, 0 , 0 ));
double Smb2Cl0 = NrmalizeDouble( iClose (Smbl2, 0 , 0 ));
double Smb1Pnt = MarketInfo (Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo (Smbl2, MODE_POINT);
int     mBars   = MathMin ( iBars (Smbl1), iBars (Smbl2));

     for (i= 1 ;i<mBars;i++) 
    {
         double Price1 =   (Smb1Cl0 - iClose (Symbol_1, 0 ,i)) / Smb1Pnt;
         double Price2 = K*(Smb1Cl0 - iClose (Symbol_2, 0 ,i)) / Smb2Pnt;
         double Spread = Price1 - Price2; 
         //Print ("Price1="+Price1, " Price2="+Price2);
         if ( MathAbs (Spread)< eps) return (i);
    }
     return (- 1 );
}
 

여보세요.

표시기에 항상 같은 기간(예: d1)이 표시되도록 표시기에 #property 가 있는지 누가 압니까?

그리고 메타트레이더에서 시간대를 바꿔도 바뀌지 않았나요?

고맙습니다

------------------------------------------------

아.. 너무 많은 프로들.....

 

돕다!!!!

스크립트에서 표시기를 호출하는 방법은 매우 필요하므로 창에 표시됩니다.

 

좋은 저녁이에요! 조언자 코드를 변경할 수 있도록 도와주세요.
1. 테스트할 때는 모든 것이 괜찮습니다. 하지만 거래할 때는 첫 번째 거래를 수동으로 열고 스탑과 테이크도 해야 합니다. 어드바이저가 활성화되고 새 틱의 가격이 도착하면 어드바이저가 자동으로 거래를 시작하기를 바랍니다.
2. 손절매 가 발동되면 이전 로트보다 2배의 로트로 다음 포지션이 열리기 때문에 이론적으로 로트는 무한대(저의 경우 51.2까지)까지 증가할 수 있으므로 제한하고 싶습니다(예를 들어 , 0.8) 임계값을 변경할 수 있습니다. 임계값에 도달하고 중지가 트리거되면 어드바이저가 꺼지지 않고 0.1부터 다시 시작됩니다.

 //--- input parameters
extern double     Lot= 0.1 ;
extern int        TP= 22 ;
extern int        SL= 20 ;
extern double     K_Martin= 2 ;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0 ;
int closetime= 0 ,lastorder= 0 , tip= 0 ;
for ( int i= 0 ;i< OrdersHistoryTotal ();i++) /* Цикл перебора ордер*/
{
if (! OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)) continue ; // Выбираем ордер из истории.
if ( OrderMagicNumber ()!=Magic) continue ;
if (closetime< OrderCloseTime ())
{
closetime = OrderCloseTime ();
lastorder = OrderTicket ();
tip= OrderType ();
ol= OrderLots ();
}
}
OrderSelect (lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= ( OrderClosePrice ());
oop= ( OrderOpenPrice ());
osl= ( OrderStopLoss ());
otp= ( OrderTakeProfit ());
ol= ( OrderLots ());
Print ( "ОРДЕР №--[" , OrderTicket (), "-" , OrderLots (), "]--" , "цена открытия ОРДЕРА--[" , OrderOpenPrice (), "]" ); 
Print ( "ОРДЕР №--[" , OrderTicket (), "-" , OrderLots (), "]--" , "цена закрытия ОРДЕРА--[" , OrderClosePrice (), "]" );
if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)==false )
{
if (tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend ( Symbol (),OP_BUY,ol*K_Martin,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 , 0 , 0 , Blue ); /*Если выполняется условие то покупаем*/
}
if (tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend ( Symbol (),OP_SELL,Lot,Bid, 0 ,Bid+SL* Point , Bid-TP* Point , 0 , 0 , 0 , Red ); /*Если выполняется условие то продаем*/ 
} 
if (tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend ( Symbol (),OP_SELL,ol*K_Martin,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 , 0 , 0 , Red ); /*Если выполняется условие то продаем*/ 
}
if (tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend ( Symbol (),OP_BUY,Lot,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 , 0 , 0 , Blue ); /*Если выполняется условие то покупаем*/
} 
}
return ( 0 );
}

 
Top2n :

전문가들이 도와주세요. 하루 종일 아무 소용이 없습니다.

주문이 촉박함(메인 BUY, SELLSTOP 안전망 보류)

무손실 SELLSTOP을 종료하면 다시 같은 장소로 연기됩니다.

이것을 돌리십시오, https://www.mql5.com/en/code/8846 .
 
7777877 :


마지막으로 내가 모든 것을 올바르게 이해했는지 확인하려면 마지막 단락에 대한 내 생각을 확인하십시오 ... 따라서 위에서 이미 언급 한 전문가를 불러 봅시다.

그런 다음 줄에서 :

정수 유형 Experts의 변수를 "GV-변수" 저장 상자에 넣습니다(이중 유형으로 변환하여). 그런 다음 (가상의 가정) Expert Advisor에 줄이 있을 경우

그러면 int 유형의 변수에 결과를 쓰라는 명령이 주어졌음을 의미합니다. 이 경우 컴파일러는 다음을 수행합니다.

* 더블 타입의 Expert 변수 값을 박스에서 꺼내고,

* Experts 변수의 값에 필요한 변경을 수행합니다.

* 이 값을 New_Experts 변수에 할당하고...

* "int" 상자에 New_Experts 변수의 값을 넣습니다.

저것. 변수 유형 - 어떤 값의 외부 래퍼/패키징 외에는 아무것도 없습니까? 따라서 GV 변수는 문자열 유형일 수 없습니다. 다운캐스팅은 숫자 값에만 허용되며 문자열은 숫자로 변환되지 않습니다.

그래서?

귀하의 응답에 미리 감사드립니다

확실히 그런 방식은 아닙니다. 사실 Experts 변수에는 이미 int 유형이 있으므로 값을 할당하기 전에 유형 변환이 발생해야 합니다. 컴파일러

* 상자에서 이중 값을 꺼냈습니다(프로그램에는 이름이 없지만 RAM의 컴파일러 또는 프로세서 레지스터에 알려진 일부 주소에 단순히 기록됨).

* 위 변수의 값으로 필요한 모든 변경을 수행하고 Expert 변수에 새 값(이미 int 유형임)을 기록했습니다.

* 이 값(int! 유형)을 New_Experts 변수에 할당했습니다. 그것들은 동일한 유형을 가지므로 하나의 메모리 셀에서 다른 메모리 셀로 값을 전송하는 것에 불과합니다.


추신: 저는 자신의 행위를 그렇게 자세하게 이해하는 사람들의 존재를 매우 기쁘게 생각합니다. 사실, 농담이 아닙니다. 다시 연락하십시오.

 
Andrew1001 :

좋은 저녁이에요! 조언자 코드를 변경할 수 있도록 도와주세요.
1. 테스트할 때는 모든 것이 괜찮습니다. 하지만 거래할 때는 첫 번째 거래를 수동으로 열고 스탑과 테이크도 해야 합니다. 어드바이저가 활성화되고 새 틱의 가격이 도착하면 어드바이저가 자동으로 거래를 시작하기를 바랍니다.
2. 손절매가 발동되면 이전 로트보다 2배의 로트로 다음 포지션이 열리기 때문에 이론적으로 로트는 무한대(저의 경우 51.2까지)까지 증가할 수 있으므로 제한하고 싶습니다(예를 들어 , 0.8) 임계값을 변경할 수 있습니다. 임계값에 도달하고 중지가 트리거되면 어드바이저가 꺼지지 않고 0.1부터 다시 시작됩니다.


노력하다:

 extern double Lot= 0.1 ,K_Martin= 2 ,porog= 0.8 ;
extern int TP= 22 ,SL= 20 ,Magic= 233 ;
extern bool poz1_up=true; //ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true; //торговля разрешить?
bool fix; int init(){fix=true; return ( 0 );} int deinit(){ return ( 0 );}
int start(){ double oop,ocp,osl,otp,ol,lotos; int closetime= 0 ,lastorder= 0 ,tip= 0 ; if (!Trade) return ( 0 );
if (poz1_up&&fix){ OrderSend ( Symbol (),OP_BUY,Lot,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 ,Magic,0, Blue );fix= 0 ;}  
if (!poz1_up&&fix){ OrderSend ( Symbol (),OP_SELL,Lot,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 ,Magic, 0 , Red );fix= 0 ;}
for ( int i= 0 ;i< OrdersHistoryTotal ();i++)
  { if (! OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)) continue ;
   if ( OrderMagicNumber ()!=Magic) continue ;
   if (closetime< OrderCloseTime ())lastorder= OrderTicket ();}
if ( OrderSelect (lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip= OrderType ();oop= OrderOpenPrice ();osl= OrderStopLoss ();
   otp= OrderTakeProfit ();ol= OrderLots ();ocp= OrderClosePrice ();}
Print ( "ОРДЕР №--[" , OrderTicket (), "-" , OrderLots (), "]--" , "цена открытия--[" , OrderOpenPrice (),
         "]--" , "цена закрытия--[" , OrderClosePrice (), "]--" , "прибыль--[" , OrderProfit (), "]" );
if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)== 0 )
  { if (tip==OP_SELL){ if (osl==ocp){lotos=ol*K_Martin; if (lotos>porog)lotos=Lot; 
     OrderSend ( Symbol (),OP_BUY,lotos,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 ,Magic, 0 , Blue );}
     if (otp==ocp) OrderSend ( Symbol (),OP_SELL,Lot,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 ,Magic, 0 , Red );} 
   if (tip==OP_BUY){ if (osl==ocp){lotos=ol*K_Martin; if (lotos>porog)lotos=Lot;
     OrderSend ( Symbol (),OP_SELL,lotos,Bid, 0 ,Bid+SL* Point ,Bid-TP* Point , 0 ,Magic, 0 , Red );} 
   if (otp==ocp) OrderSend ( Symbol (),OP_BUY,Lot,Ask, 0 ,Ask-SL* Point ,Ask+TP* Point , 0 ,Magic, 0 , Blue );}} return ( 0 );}
//+------------------------------------------------------------------+
 
안녕하세요. 테스터에서 직접 거래하는 방법을 읽을 수있는 곳을 알려주십시오. 고맙습니다.