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

 

후행 정지 및 손익분기점 출력을 추가할 위치는 어디입니까? 그리고 보증금이 증가하면 무언가가 많이 증가하지 않습니다.

////////////////////////////////////////////////////// / ///////////////////////////////////////////////////// // /////////////////////////////////////////////////// /// ////////////

int Buy(int StopLoss = 0, int TakeProfit = 0, Double Lot = 0)

{

정수 티켓 = 0;

이중 SL = 0;

이중 TP = 0;

이중 볼륨 로트 = 0;

새로 고침();

if (스톱로스 != 0)

에스엘 = NormalizeDouble (Bid-StopLoss*Point, Digits);

if (이익 실현 != 0)

TP = NormalizeDouble(Ask+TakeProfit*Point, Digits);

경우 (많은 == 0)

VolumeLot = GetLot();

또 다른

볼륨 로트 = 로트;

티켓 = OrderSend(Symbol(), OP_BUY, VolumeLot, NormalizeDouble(Ask, Digits), 20, SL, TP, NULL, AccountNumber(), 0, 녹색);

if (티켓 == -1)

{

반환(GetLastError());

}

또 다른

{

반환(티켓);

}

}

int Sell(int StopLoss = 0, int TakeProfit = 0, Double Lot = 0)

{

정수 티켓 = 0;

이중 SL = 0;

이중 TP = 0;

이중 볼륨 로트 = 0;

새로 고침();

if (스톱로스 != 0)

에스엘 = NormalizeDouble(Ask+StopLoss*Point, Digits);

if (이익 실현 != 0)

TP = NormalizeDouble(Bid-TakeProfit*Point, Digits);

경우 (많은 == 0)

VolumeLot = GetLot();

또 다른

볼륨 로트 = 로트;

티켓 = OrderSend(Symbol(), OP_SELL, VolumeLot, NormalizeDouble(Bid, Digits), 20, SL, TP, NULL, AccountNumber(), 0, Red);

if (티켓 == -1)

반환(GetLastError());

또 다른

반환(티켓);

}

더블 GetLot()

{

인트 로트;

if (AccountBalance()>=300) lot=0.01;

if (AccountBalance()>=500) lot=0.02;

if (AccountBalance()>=800) lot=0.03;

반환(로트);

}

 
mahla :

후행 정지 및 손익분기점 출력을 추가할 위치는 어디입니까? 그리고 보증금이 증가하면 무언가가 많이 증가하지 않습니다.

////////////////////////////////////////////////////// / ///////////////////////////////////////////////////// // /////////////////////////////////////////////////// /// ////////////

고문에서

 //+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

로트증가기능...... 아마 바꾸는게 나을듯

예시:

 extern double Lots               = 0.1 ;
extern double MaximumRisk        = 0.02 ;
extern double DecreaseFactor     = 3 ;
//////
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int     orders=HistoryTotal();     // history orders total
   int     losses= 0 ;                   // number of losses orders without a break
//---- select lot size
   lot= NormalizeDouble ( AccountFreeMargin ()*MaximumRisk/ 1000.0 , 1 );
//---- calcuulate number of losses orders without a break
   if (DecreaseFactor> 0 )
     {
       for ( int i=orders- 1 ;i>= 0 ;i--)
        {
         if ( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)==false) { Print ( "Error in history!" ); break ; }
         if ( OrderSymbol ()!= Symbol () || OrderType ()>OP_SELL) continue ;
         //----
         if ( OrderProfit ()> 0 ) break ;
         if ( OrderProfit ()< 0 ) losses++;
        }
       if (losses> 1 ) lot= NormalizeDouble (lot-lot*losses/DecreaseFactor, 1 );
     }
//---- return lot size
   if (lot< 0.1 ) lot= 0.1 ;
   return (lot);
  }

이동 평균 .mq4 확인

 

가격 가치가 아니라 모멘텀 가치를 위해 구축된 EA에서 볼린저 밴드 를 사용하는 방법을 알려주실 수 있습니까? 나는 다음과 같이 시도했다 :

BandOPeriodT - 외부 변수, 볼린저 밴드 기간.

MomentumPeriodT - 각각 운동량 기간입니다.

BandOBBottom=iBands(NULL,0,BandOPeriodT,1,0,iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0),MODE_LOWER,0);

또한 다음과 같이:

MomO = iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0); - 모멘텀 값을 반환하는 내부 변수

BandOBBottom=iBands (NULL,0,BandOPeriodT,1,0, MomO ,MODE_LOWER,0); - 변수의 값은 이전 변수의 값에 대한 더 낮은 볼린저 밴드의 값을 반환해야 합니다.

그러나 MODE_LOWER가 변수의 LOWER 볼린저 밴드 값을 얻는다는 것을 올바르게 이해하고 있습니까? 그렇지 않다면 어떻게 얻습니까?

 
Ovari :

가격 가치가 아니라 모멘텀 가치를 위해 구축된 EA에서 볼린저 밴드를 사용하는 방법을 알려주실 수 있습니까? 나는 다음과 같이 시도했다 :

BandOPeriodT - 외부 변수, 볼린저 밴드 기간.

MomentumPeriodT - 각각 운동량 기간입니다.

BandOBBottom=iBands(NULL,0,BandOPeriodT,1,0,iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0),MODE_LOWER,0);

또한 다음과 같이:

MomO = iMomentum(NULL,0,MomentumPeriodT,PRICE_OPEN,0); - 모멘텀 값을 반환하는 내부 변수

BandOBBottom=iBands (NULL,0,BandOPeriodT,1,0, MomO ,MODE_LOWER,0); - 변수의 값은 이전 변수의 값에 대한 더 낮은 볼린저 밴드의 값을 반환해야 합니다.

그러나 MODE_LOWER가 변수의 LOWER 볼린저 밴드 값을 얻는다는 것을 올바르게 이해하고 있습니까? 그렇지 않다면 어떻게 얻습니까?


예고편 보기 - 집에서 RSI용 밴드 있음 - Momentum 에 대해서만 동일한 방식으로 모든 작업을 수행하십시오.

설명 - 로그에서 - 시작 부분의 코드를 참조하십시오.

 
감사합니다. 그렇지 않으면 저는 프로그래머가 아닌 매우 초보자입니다. :)
 

안녕하세요! 도와주세요! PVT 표시기를 사용해보고 싶습니다.

 double PVT = iCustom ( NULL , 240 , "PVT" , PRICE_CLOSE , 1 , 1 )

말해 주세요. 무엇이 빠졌습니까?

로그에 쓰기: 2012.05.14 19:34:46 EURUSD,H4에서 'C:\Program Files\Alpari NZ MT4\experts\indicators\PVT.ex4' 파일을 열 수 없습니다.

고맙습니다!

 
mahla :

후행 정지 및 손익분기점 출력을 추가할 위치는 어디입니까? 그리고 보증금이 증가하면 무언가가 많이 증가하지 않습니다.

////////////////////////////////////////////////////// / ///////////////////////////////////////////////////// // /////////////////////////////////////////////////// /// ////////////

int Buy(int StopLoss = 0, int TakeProfit = 0, Double Lot = 0)

{

정수 티켓 = 0;

이중 SL = 0;

이중 TP = 0;

이중 볼륨 로트 = 0;

새로 고침();

if (스톱로스 != 0)

에스엘 = NormalizeDouble(Bid-StopLoss*Point, Digits);

if (이익 실현 != 0)

TP = NormalizeDouble(Ask+TakeProfit*Point, Digits);

경우 (많은 == 0)

VolumeLot = GetLot();

또 다른

볼륨 로트 = 로트;

티켓 = OrderSend(Symbol(), OP_BUY, VolumeLot, NormalizeDouble(Ask, Digits), 20, SL, TP, NULL, AccountNumber(), 0, 녹색);

if (티켓 == -1)

{

반환(GetLastError());

}

또 다른

{

반환(티켓);

}

}

int Sell(int StopLoss = 0, int TakeProfit = 0, Double Lot = 0)

{

정수 티켓 = 0;

이중 SL = 0;

이중 TP = 0;

이중 볼륨 로트 = 0;

새로 고침();

if (스톱로스 != 0)

에스엘 = NormalizeDouble(Ask+StopLoss*Point, Digits);

if (이익 실현 != 0)

TP = NormalizeDouble(Bid-TakeProfit*Point, Digits);

경우 (많은 == 0)

VolumeLot = GetLot();

또 다른

볼륨 로트 = 로트;

티켓 = OrderSend(Symbol(), OP_SELL, VolumeLot, NormalizeDouble(Bid, Digits), 20, SL, TP, NULL, AccountNumber(), 0, Red);

if (티켓 == -1)

반환(GetLastError());

또 다른

반환(티켓);

}

더블 GetLot()

{

인트 로트;

if (AccountBalance()>=300) lot=0.01;

if (AccountBalance()>=500) lot=0.02;

if (AccountBalance()>=800) lot=0.03;

반환(로트);

}

우리는 열린 위치가 이미 선택되었다고 가정하고 이 위치가 열려 있음을 확실히 알고 있습니다.
전문가가 부착된 기호로. 또한 후행 중지의 값을 가정합니다.
in pips는 TrailingStop 변수에 포함됩니다.

   int err;
   if ( OrderType () == OP_BUY)
     {
       // позиция на покупку
       if ((Bid- OrderOpenPrice ())>=(TrailingStop* Point ))
         {
           // выставляем Stop Loss
           if ( OrderModify ( OrderTicket (), OrderOpenPrice (), Bid-TrailingStop* Point ,
                                     OrderTakeProfit (), 0 ))
             Print ( "#" , OrderTicket (), ": trailing stop " , Bid-TrailingStop* Point );
           else
             {
              err = GetLastError ();
               Print ( "#" , OrderTicket (), ": trailing stop error " , err);
             }
         }
     }
   else
     {
       // позиция на продажу
       if (( OrderOpenPrice ()-Ask)>=(TrailingStop* Point ))
         {
           // выставляем Stop Loss
           if ( OrderModify ( OrderTicket (), OrderOpenPrice (), Ask+TrailingStop* Point ,
                                     OrderTakeProfit (), 0 ))
             Print ( "#" , OrderTicket (), ": trailing stop " , Ask+TrailingStop* Point );
           else
             {
              err = GetLastError ();
               Print ( "#" , OrderTicket (), ": trailing stop error " , err);
             }
         }
     }
OrderProfit() 함수는 OrderSelect() 함수를 사용하여 선택한 주문에 대한 이익을 반환합니다.

마감된 위치에서 받은 이익을 계산하려고 한다고 가정해 보겠습니다.

   int profit = 0 ;
   int pos;
   for ( pos = 0 ; pos<HistoryTotal(); pos++ )
     {
       // выделим позицию
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY) == true)
         {
           // это не отложенный ордер?
           if ( OrderType () <= OP_SELL) profit += OrderProfit ();            
         }
       else
           Print ( "Ошибка " , GetLastError (), " при выделении ордера " , OrderTicket ());
     }
   Print ( "Суммарный профит по закрытым позициям = " , profit);
모든 마감된 위치에 대한 이익을 계산하는 전체 코드는 다음과 같습니다.
오늘 열려있는 것은 다음과 같습니다.

   //---- вычислим начало дня - переменная day_start
   int c_time = CurTime();  
   datetime day_start;
   day_start=c_time- TimeHour (c_time)* 60 * 60 - TimeMinute (c_time)* 60 - TimeSeconds (c_time);
   //---- подсчитаем прибыль
   int profit = 0 ;
   int pos;
   for ( pos = 0 ; pos<HistoryTotal(); pos++ )
     {
       // выделим позицию
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY) == true)
         {
           // это не отложенный ордер?
           if ( OrderType () <= OP_SELL)
             {
               // ордер был открыт сегодня?
               if ( OrderOpenTime ()>=day_start) profit += OrderProfit ();
             }
         }
       else
           Print ( "Ошибка " , GetLastError (), " при выделении ордера " , OrderTicket ());
     }
   Print ( "Суммарный профит по закрытым позициям = " , profit);
 
mahla :

? 그리고 보증금이 증가하면 무언가가 많이 증가하지 않습니다.

////////////////////////////////////////////////////// / ///////////////////////////////////////////////////// // /////////////////////////////////////////////////// /// ////////////


아마도 코드에 다음이 누락되었을 수 있습니다.

이중 주문 로트 ( )
선택한 주문의 로트 수를 반환합니다.
OrderSelect() 함수를 사용하여 주문을 미리 선택해야 합니다.
예시:
 if(OrderSelect(10,SELECT_BY_POS)==true)
    Print("10개 주문에 대한 로트",OrderLots());
  또 다른
    Print("OrderSelect()가 오류를 반환했습니다 - ",GetLastError());
 
borilunad :

안녕하세요! 도와주세요! PVT 표시기를 사용해보고 싶습니다.

말해 주세요. 무엇이 빠졌습니까?

로그에 쓰기: 2012.05.14 19:34:46 EURUSD,H4에서 'C:\Program Files\Alpari NZ MT4\experts\indicators\PVT.ex4' 파일을 열 수 없습니다.

고맙습니다!

실제 PVT 표시기가 없습니다(확실히 가지고 계십니까?).
 
alsu :
실제 PVT 표시기가 없습니다(확실히 가지고 계십니까?).

물론 컴파일된 것과 ex4가 모두 있습니다. 그리고 일정에 맞춰보세요. 내가 뭔가를 쓰지 않은 건 아닐까? 고맙습니다!