[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 239

 
dmmikl86 >> :

자외선 포럼 사용자!

지표를 작성했는데 문제는 이동 평균(Buf_2)이 그려지지 않는다는 것입니다. 코드는 다음과 같습니다.

문제가 무엇인지 이해하도록 도와주세요.

//average i<0 이후에 주기를 입력하지 않으면 왜 그려지나요? 그렇지 않으면 이전 주기를 종료하지 않습니다.

 i + + ; // поставьте здесь увеличение на один и всё заработает или присвойте i=0; напрямую ноль
//====================================================================
// average
int n = 0 ;
   while ( i > = 0 ) 
       {   
       //----
       while ( n < = average ) {
         Buf_2 [ i ] = Buf_1 [ i - n ] ;
         n + + ;
         }
       
       i - - ;
       //----
       }

//----
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
 

안녕하세요)


중요성에 대해 죄송합니다. 이미이 질문을했지만 답변을 이해하지 못했습니다 (일반적으로 일주일 동안 아무 것도 움직이지 않았습니다.


보류 주문 을 위한 함수를 작성하는 방법을 알려주십시오.


Bid 또는 Ask 대신 운전할 방법은 무엇입니까? 양초 중 하나의 High에 대한 지연이 필요합니다. 이 값을 얻었고 함수에 어떻게 입력합니까? 결국, 이 가격이 거래 흐름에 없을 수 있습니까? 일반적으로 연기자를 설정하는 코드를 게시할 수 있습니까? 가장 중요한 것은 설정 가격을 어디에서 얻을 수 있느냐는 것입니다!!

 

예를 들어(구매 정지 설정의 예):

(지연을 설정하기 위해 설치 가격이 견적 흐름에 있을 필요는 전혀 없습니다.

현재 가격에서 춤을 추거나 아무 가격이나 취할 수 있으므로 이 DC에서 허용되는 정지 수준만 현재 가격에서 지연 설정 가격까지 관찰됩니다)

( 'EURUSD - 동향, 예측 및 시사점' )

 extern int      Magic = 77777 ;
extern int      StopLoss = 400 ;
extern int      TakeProfit = 120 ;
extern double   Lots = 0.1 ;

static int prevtime = 0 ;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>


//=======================================================
int start ( )
{
if ( Time [ 0 ] = = prevtime )   return ( 0 ) ; //ждём появления нового бара
   prevtime = Time [ 0 ] ; //если появился новый бар , включаемся
   

//-----------------------------------------------------------------------
if ( NumberOfOrders ( NULL , OP_BUYSTOP , Magic ) < 1 )  { //если нет открытых бай- поз.
if   ( NumberOfPositions ( NULL , OP_BUY , Magic ) < 1 )  { //если нет ордеров байстоп
double priceBUY = iHigh ( NULL , 0 , iHighest ( NULL , 0 , MODE_HIGH , 50 , 0 ) ) ; //-задаем цену
// установки  ордера по максимуму из посл. 50-ти свечей
double SL = 0 ; double TP = 0 ;//выставляем стопы
if ( StopLoss > 0 )   SL = priceBUY - Point * StopLoss ;
if ( TakeProfit > 0 ) TP = priceBUY + Point * TakeProfit ;  
//ставим ордер 
ticket = OrderSend ( Symbol ( ) , OP_BUYSTOP , Lots , price , 5 , SL , TP , "байстоп" , Magic , 0 , Blue ) ;
if ( ticket < 0 ) { Print ( "Ошибка открытия ордера BUY #" , GetLastError ( ) ) ; 
               Sleep ( 10000 ) ;   return ( 0 ) ; }
} }
//--------------------------------------------------------------------------

Аналогично ставится селл-стоп


//----------------------------------------------------------------------------
return ( 0 ) ;
 //-----------------Конец функции int start()----
} //int start()

//--------ставим пользовательские функции -------------

대신에

두 배 가격BUY = ..... ....

당신의 공식을 입력

 

나는 지표를 쓰고 있는데, 그 핵심은 다음과 같습니다. 촛대가 강세 라면 지표선 은 약세입니다. 음, 볼륨이 이 모든 것에 추가됩니다(각 촛대가 볼륨의 무게를 갖도록). 그리고 두 번째 라인은 현재 라인으로부터의 이동 평균입니다.

 #property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int average = 14 ;
//---- buffers
double Buf_1 [ ] , Buf_2 [ ] ;
double sum_b ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init ( )
  {
//---- indicators
   SetIndexStyle ( 0 , DRAW_LINE ) ;
   SetIndexBuffer ( 0 , Buf_1 ) ;
   SetIndexStyle ( 1 , DRAW_LINE ) ;
   SetIndexBuffer ( 1 , Buf_2 ) ;
   
   sum_b = 0.0 ;
//----
   return ( 0 ) ;
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit ( )
  {
//----
   
//----
   return ( 0 ) ;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start ( )
  {
   int    i , 
          Counted_bars = IndicatorCounted ( ) ;

int n = 0 ;
//----
//====================================================================
// график тела с объемом

i = Bars - Counted_bars - 1 ;           // Индекс первого непосчитанного
   while ( i > = 0 ) 
      {  
       //----
       if ( Close [ i ] > Open [ i ] ) {
         sum_b = sum_b + ( Close [ i ] - Open [ i ] ) * Volume [ i ] ;
         Buf_1 [ i ] = sum_b ;
         }
         
       if ( Close [ i ] < Open [ i ] ) {
         sum_b = sum_b - ( Open [ i ] - Close [ i ] ) * Volume [ i ] ;
         Buf_1 [ i ] = sum_b ;
         }
         
       if ( NormalizeDouble ( Close [ i ] , Digits ) = = NormalizeDouble ( Open [ i ] , Digits ) ) {
         Buf_1 [ i ] = Buf_1 [ i - 1 ] ;
         }
       
       // average  
       while ( n < = average ) {
         Buf_2 [ i ] = Buf_1 [ i - n ] ;
         n + + ;
         }

       i - - ;
       //----
      }
//====================================================================


//----
   return ( 0 ) ;
  }
//+------------------------------------------------------------------+
문제: 메인 라인은 닷지 형성 중에 피크를 그리고 이동 평균은 그려지지 않습니까?
 
dmmikl86 >> :

나는 지표를 쓰고 있는데, 그 핵심은 촛대가 강세라면 지표선은 약세라는 것입니다. 음, 볼륨이 이 모든 것에 추가됩니다(각 양초가 볼륨의 무게를 갖도록). 그리고 두 번째 라인은 현재 라인으로부터의 이동 평균입니다.

문제: 메인 라인은 닷지 형성 중에 피크를 그리고 이동 평균은 그려지지 않습니까?


if 블록은 더 효율적인 블록으로 대체될 수 있습니다.

 if ( Close [ i ] > Open [ i ] ) {
         sum_b = sum_b + ( Close [ i ] - Open [ i ] ) * Volume [ i ] ;
         Buf_1 [ i ] = sum_b ;
}
else if ( Close [ i ] < Open [ i ] ) {
         sum_b = sum_b - ( Open [ i ] - Close [ i ] ) * Volume [ i ] ;
         Buf_1 [ i ] = sum_b ;
}
else {    //       if (NormalizeDouble(Close[i],Digits)==NormalizeDouble(Open[i],Digits)) {
         Buf_1 [ i ] = Buf_1 [ i + 1 ] ;
}

[i + 1] - 왜냐하면 인덱스 배열은 오른쪽에서 왼쪽으로 번호가 매겨집니다. 이제 몸체가 0인 양초가 올바르게 처리됩니다.

중간 라인 buf_2를 사용하면 작성자가 원하는 것이 코드에서 전혀 명확하지 않습니다 .


 
OneDepo >> :

if 블록은 더 효율적인 블록으로 대체될 수 있습니다.

[i + 1] - 왜냐하면 인덱스 배열은 오른쪽에서 왼쪽으로 번호가 매겨집니다. 이제 몸체가 0인 양초가 올바르게 처리됩니다.

중간 라인 buf_2를 사용하면 작성자가 원하는 것이 코드에서 전혀 명확하지 않습니다 .


지표 값을 기반으로 하는 기간이 14인 이동 평균이 되기를 원했습니다.

 
dmmikl86 >> :

지표 값을 기반으로 하는 기간이 14인 이동 평균이 되기를 원했습니다.

다음과 같이:

 //+------------------------------------------------------------------+
//|                                                     dmmikl86.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int BarsCount = 1000 ;
extern int average = 14 ;

//---- buffers
double Buf_1 [ ] , Buf_2 [ ] ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init ( )
   {
     if ( average < 1 )
        average = 1 ;

     //---- indicators
     SetIndexStyle ( 0 , DRAW_LINE ) ;
     SetIndexBuffer ( 0 , Buf_1 ) ;
     SetIndexStyle ( 1 , DRAW_LINE ) ;
     SetIndexBuffer ( 1 , Buf_2 ) ;
     //----
     return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit ( )
   {
//----
//----
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start ( )
{
     int i , n ;

     //====================================================================
     // график тела с объемом
     double s , sum_b = 0 ;

     int limit = BarsCount ;
     if ( limit > Bars )
        limit = Bars ;

     for ( i = limit ; 0 < = i ; i - - ) {

         if ( Close [ i ] > Open [ i ] ) {
            sum_b + = ( Close [ i ] - Open [ i ] ) * Volume [ i ] ;
            Buf_1 [ i ] = sum_b ;
         }
         else if ( Close [ i ] < Open [ i ] ) {
            sum_b - = ( Open [ i ] - Close [ i ] ) * Volume [ i ] ;
            Buf_1 [ i ] = sum_b ;
         }
         else {
            Buf_1 [ i ] = Buf_1 [ i + 1 ] ;
         }

         // SMA calculation
         if ( i + average < limit ) {
            s = 0 ;
             for ( n = 0 ; n < average ; n + + ) {
                s + = Buf_1 [ i + n ] ;
             }
            Buf_2 [ i ] = s / average ;
         }

     }

     return ( 0 ) ;
   }
//+------------------------------------------------------------------+
 
이 바에 이미 거래가 있는 경우 이 바에서 더 이상 주문을 열지 않고 바당 한 번 거래가 이루어지도록 하는 방법은 무엇입니까?
 
이 스레드를 보세요.
 
Vinin >> :
이 스레드를 보세요.

또는 Kovalev의 교과서에서 문제 27 을 읽으십시오. 코드 예제와 작동 방식에 대한 자세한 설명이 있습니다.