포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 198

 
Atlis :

안녕하세요.

다음을 수행하는 방법을 조언해 주십시오.

가격은 1.9047 - 1.9080 범위에서 움직이고 있습니다(숫자는 조건부입니다). 다음 캔들의 시가가 지정된 범위를 벗어나면 경고를 발행하십시오. 작동하지 않으면 다음 촛불을 기다리십시오. 가격이 범위를 벗어날 때까지 계속됩니다.

미리 감사드립니다.


   if (Open[ 0 ]< 1.9047 ) Alert ( "Цена ниже заданного диапазона" );
   if (Open[ 0 ]> 1.9080 ) Alert ( "Цена выше заданного диапазона" );
이것은 단지 개념일 뿐입니다. 조건이 충족되면 모든 틱 에 경고가 표시됩니다.
 

다음은 분석에 추가로 사용되는 데이터입니다.

   if (CurTime() == tm2)              //tm1 и tm2 - заданное время
   {
   //ObjectCreate ( "line2" , OBJ_VLINE , 0 ,tm1, 0 );
   price1=iHigh( Symbol (),PERIOD_M30, 1 );
   //ObjectCreate ( "highLine" , OBJ_HLINE , 0 , 0 ,price1);
   price2=iLow( Symbol (), PERIOD_M30 , 1 );
   // ObjectCreate ( "lowLine" , OBJ_HLINE , 0 , 0 ,price2);
   Alert ( "price1=" ,price1);
   Alert ( "price2=" ,price2);
   }

저것들. 코드는 다음과 같습니다.

 if (Open[ 0 ]<price2) Alert ( "Цена ниже заданного диапазона" );
 if (Open[ 0 ]>price1) Alert ( "Цена выше заданного диапазона" );

그리고 문제는 등록 방법과 위치입니다. 조건 내부에 있으면 경보가 발생하지 않고 조건 외부에 있으면 틱마다 표시됩니다.

이전에 잘못 공식화된 질문에 대해 사과드립니다.

 
Atlis :

다음은 분석에 추가로 사용되는 데이터입니다.

저것들. 코드는 다음과 같습니다.

그리고 문제는 등록 방법과 위치입니다. 조건 안에 있으면 경보가 울리지 않고 조건 밖에 있으면 눈금마다 표시됩니다.

이전에 잘못 공식화된 질문에 대해 사과드립니다.

내부에 시간 확인 조건을 넣으면 가격이 범위 제한을 벗어난 경우에만 가격 알림이 나타납니다.
 
덕분에 대충 알았습니다. 여기에 또 다른 질문이 있습니다. 이제 지정된 기간부터 범위가 "중지"까지 초과될 때 경고가 표시됩니다. 조건을 충족하는 첫 번째 값에 도달했을 때 이 "열거"를 어떻게든 중지할 수 있습니까?
 
Atlis :
덕분에 대충 알았습니다. 여기에 또 다른 질문이 있습니다. 이제 지정된 기간부터 범위가 "중지"까지 초과될 때 경고가 표시됩니다. 조건을 충족하는 첫 번째 값에 도달했을 때 이 "열거"를 어떻게든 중지할 수 있습니까?

글쎄, 당신은 항상 특정 시간 동안 사실 인 주요 조건을 이해해야합니다. 예를 들어 - 시간 비교. 모든 경보를 발행한 후 현재 시간을 확인할 변수에 새 값을 할당해야 합니다. 새로운 막대 감지 기능을 찾으십시오. 건설 개념이 도움이 될 것입니다.

여기 읽어 보셨어요?

 

보류 중인 주문 을 하기 위한 시장과의 최소 거리를 찾는 방법은 무엇입니까?

 
Elektronik :

대기 중인 주문을 하기 위해 시장에서 최소 거리를 찾는 방법은 무엇입니까?

int level=MarketInfo(Symbol(), MODE_STOPLEVEL);

stoplevel이 0이면 level=MarketInfo(Symbol(), MODE_SPREAD)*2일 가능성이 큽니다.

Alpari는 정확히 StopLevel과 같은 이중 스프레드를 사용합니다.

거리를 결정하려면 여기 를 읽으십시오.

 

감사 합니다 artmedia70 :

 
artmedia70 :

좋습니다. 오랫동안 답변하지 않으셨습니다. 힌트를 드리겠습니다. isCloseLastPosByStop() 함수에서 true를 반환할 때 값을 하나 더 반환합니다. 즉, 찾은 마지막 위치의 로트 크기입니다.

수행하는 방법? 참조로 함수에 변수를 전달하면 함수 자체에 로트 크기를 기록할 수 있습니다. 이렇게 하려면 isCloseLastPosByStop() 함수를 약간 변경해야 합니다.

아무것도 이해하지 못한다면 마지막 마감 위치의 로트 크기를 반환하는 함수를 찾으십시오. 아니면 스스로 하세요. 그리고 그것을 사용하지만 실제 값과 함께 로트 값을 전달하는 것보다 비용이 많이 듭니다.

함수를 변경했는데, True 대신 함수 자체에 로트 크기를 적어둔 변수 lot을 반환하도록 만들었습니다.

모든 것이 컴파일되지만 주문은 열리지 않습니다.

2013.10.23 20:57:46 2011.02.24 16:25 이전 CANDLE EURUSD,M5: OrderSend 오류 4051

2013.10.23 20:57:46 2011.09.22 22:20 PREV CANDLE EURUSD,M5: OrderSend 기능 에 대한 유효하지 않은 로트 금액

 if (isCloseLastPosByStop ()== lot )         //если последний ордер закрылся по стопу
{
P=lot* 2 ;                                      //открыть ордер объемом = объему закрытому по стопу ордеру умноженному на 2                                  
OrderSend ( Symbol (),OP_SELL,P,Bid, 1 ,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );
}
else                                         //если последний ордер закрылся не по стопу
{

P= 0.1 ;  
OrderSend ( Symbol (),OP_SELL, 1 ,Bid,P,Ask+ 1500 * Point ,Ask- 300 * Point , "jfh" , 123 );   //открыть ордер обычным объемом 0.1
}
   return ( 0 );
  }
//============================================================  
bool isCloseLastPosByStop( string sy= "" , int op=- 1 , int mn=- 1 ) {
   datetime t;
   double    ocp, lot , osl;                                             // добавил переменную - количество лотов в оредере
   int       dg, i, j=- 1 , k=OrdersHistoryTotal();

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
       if (OrderSymbol()==sy || sy== "" ) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==op) {
             if (mn< 0 || OrderMagicNumber()==mn) {
               if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
     if (dg== 0 ) if ( StringFind (OrderSymbol(), "JPY" )< 0 ) dg= 4 ; else dg= 2 ;
    ocp= NormalizeDouble (OrderClosePrice(), dg);
    osl= NormalizeDouble (OrderStopLoss(), dg);
     if (ocp==osl)
     lot=OrderLots( ) ;                              //добавил вычисление количества лотов в ордере который закрылся по стопу.
     return ( lot );                                    // вместо возвращаемого функцией значения True вставил переменную lot со значением количества лотов
  }
   return (False);
}

제 실수가 무엇인지 알려주세요.

고맙습니다.

 
solnce600 :

함수를 변경했는데, True 대신 함수 자체에 로트 크기를 적어둔 변수 lot을 반환하도록 만들었습니다.

모든 것이 컴파일되지만 주문은 열리지 않습니다.

2013.10.23 20:57:46 2011.02.24 16:25 이전 CANDLE EURUSD,M5: OrderSend 오류 4051

2013.10.23 20:57:46 2011.09.22 22:20 PREV CANDLE EURUSD,M5: OrderSend 기능에 대한 유효하지 않은 로트 금액

제 실수가 무엇인지 알려주세요.

고맙습니다.


stop으로 마지막 닫힌 위치 를 결정하는 함수는 bool 유형을 가지고 있으며 이중 유형을 반환하려고 합니다. 따라서 0 또는 1을 반환합니다.

글쎄, 나는 당신이 그것을 참조하여 한 변수의 전송을 추가해야한다고 썼습니다.

 //+----------------------------------------------------------------------------+
bool isCloseLastPosByStop( string sy, int op, int mn, double &ll) {
   double    pt;
   int       t, dg, i, j=- 1 , k=OrdersHistoryTotal()- 1 ;

   for (i=k; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue ;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)         continue ;   // если символ не тот, переходим к следующему
         if (OrderType()!=op           continue ;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if ( OrderSelect (j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);       // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
       if ( MathAbs (OrderClosePrice()-OrderStopLoss()< 0.5 *pt)) { // Если закрыт по стопу
         ll=OrderLots();                               // записываем количество лотов в ордере, закрытом по стопу
         return ( true );                                 // возвращаем истину
         }
      }
   return (False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
//+----------------------------------------------------------------------------+

이제 예를 들어 마지막 구매를 확인합니다.

 //+----------------------------------------------------------------------------+
double Lot=MarketInfo( Symbol (), MODE_MINLOT);             // задаём минимальное значение переменной
if (isCloseLastPosByStop( Symbol (), OP_BUY, Magic, Lot)) { // в переменную Lot будет записано значение лота закрытой позиции
   // Если последний закрытый Buy закрыт по стопу
   Lot= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
   }
//+----------------------------------------------------------------------------+

대충 이정도...