그리고 이것으로 "만화"를 만들자 (다중 통화) - 페이지 6

 
Swan >> :

항상 오류 130.

StopLoss 및 Enter에 대해 StopLevel을 확인해야 합니다.


그리고 이초

가장 큰 것을 선택해야 합니까?


-130 지연 설정 시도로 인해 가격이 오르거나 낮음) 코드에 Marketlevel로 주석 처리된 줄이 있습니다.. 이것은 미래의 가격 추적이므로 이 오류가 발생하지 않습니다)

- Stop에 대한 OrderOpenPrice의 가장 작은 저가 또는 고가) 구매하면 0 양초와 1 양초의 가장 작은 저가 H4 ... 및 마을에 대한 가장 큰 고가 .. 일반적으로 스톱에 대한 가장 작은 저가/고가

 
ALex2008 >> :

-130 지연 설정 시도로 인해 가격이 오르거나 낮음) 코드에 Marketlevel로 주석 처리된 줄이 있습니다.. 이것은 미래의 가격 추적이므로 이 오류가 발생하지 않습니다)

- Stop에 대한 OrderOpenPrice의 가장 작은 저가 또는 고가) 구매하면 0 양초와 1 양초의 가장 작은 저가 H4 ... 및 마을에 대한 가장 큰 고가 .. 일반적으로 스톱에 대한 가장 작은 저가/고가

정확합니다. 이제 가장 높은 저점이 매수에 선택되고 가장 낮은 고가가 매도에 선택됩니다.

그 쯤

StopLoss=MathMin(b0,b1);
StopLoss=MathMax(s0,s1);
 
Swan >> :

정확합니다. 이제 가장 높은 저점이 매수에 선택되고 가장 낮은 고가가 매도에 선택됩니다.

논리적으로 모든 것이 정확합니다!) 이것은 중지를 위한 선택입니다(두 옵션 중 가장 작은 것이 선택됨)

예시:


하지만 당신의 버전은 더 좋고 간단합니다 ... 나는 그것을 고칠 것입니다. 반대의 경우) Senks.

StopLoss=MathMax(b0,b1);
StopLoss=MathMin(s0,s1);

5페이지의 코드를 수정했습니다.

 
ALex2008 >> :

논리적으로 모든 것이 정확합니다!) 이것은 중지를 위한 선택입니다(두 옵션 중 가장 작은 것이 선택됨)



여전히 최소 구매)

imho 첫 번째 막대에서 트롤하는 것이 더 낫습니다. 논리가 다릅니다 :)


StopLevel과 함께.

당신은 변경할 수 있습니다 입력

 void UpTrend ( )
   {
   if ( iOpen ( NULL , PERIOD_H4 , 1 ) - iClose ( NULL , PERIOD_H4 , 1 ) < = 0
   & & iOpen ( NULL , PERIOD_H4 , 2 ) - iClose ( NULL , PERIOD_H4 , 2 ) > 0 )
       {
      DellAllOrders ( ) ;
      Enter = iHigh ( NULL , PERIOD_H4 , 1 ) + ( Ask - Bid ) + 10 * Point ;
       if ( Enter - Ask < StopLevel ) Enter = Ask + StopLevel ;
       OrderSend ( Symbol ( ) , OP_BUYSTOP , 0.1 , Enter , 0 , 0 , Enter + Profit , 0 , 0 , 0 , Green ) ;
       }
   }

또는 즉시 주문을 엽니다.

 void UpTrend ( )
   {
   if ( iOpen ( NULL , PERIOD_H4 , 1 ) - iClose ( NULL , PERIOD_H4 , 1 ) < = 0
   & & iOpen ( NULL , PERIOD_H4 , 2 ) - iClose ( NULL , PERIOD_H4 , 2 ) > 0 )
       {
      DellAllOrders ( ) ;
      Enter = iHigh ( NULL , PERIOD_H4 , 1 ) + ( Ask - Bid ) + 10 * Point ;
       if ( Enter - Ask < StopLevel )
       OrderSend ( Symbol ( ) , OP_BUY , 0.1 , Ask , 0 , 0 , Ask + Profit , 0 , 0 , 0 , Green ) ;
       else 
       OrderSend ( Symbol ( ) , OP_BUYSTOP , 0.1 , Enter , 0 , 0 , Enter + Profit , 0 , 0 , 0 , Green ) ;
       }
   }

또는 생각할 다른 것)

 
Swan писал(а) >>

여전히 최소 구매)

imho 첫 번째 막대에서 트롤하는 것이 더 낫습니다. 논리가 다릅니다 :)

StopLevel과 함께.

당신은 변경할 수 있습니다 입력

또는 즉시 주문을 엽니다.

또는 생각할 다른 것)

시작 가격은 Bid 또는 Ask에서 더 멀리 스탑 레벨이어야 합니다. 시작 가격에서 테이크 및 스톱을 계산합니다. 이 역시 스탑 레벨보다 가깝지 않아야 합니다. 그들에게는 이익이나 손실을 위해 폐쇄 블록을 만들 수 있지만

 
Swan >> :

...imho 첫 번째 막대에서 트롤하는 것이 더 낫습니다. 논리가 다릅니다. :)

나도 그랬는데.. 현재 정류장에서 테스트 결과가 더 좋다)

 

스톱레벨을 수정했습니다...

 //-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend ( ) {
     if ( ( iOpen ( NULL , PERIOD_H4 , 1 ) - iClose ( NULL , PERIOD_H4 , 1 ) < = 0 ) & &
        ( iOpen ( NULL , PERIOD_H4 , 2 ) - iClose ( NULL , PERIOD_H4 , 2 ) > 0 ) ) {
         DellAllOrders ( ) ;
         Enter = iHigh ( NULL , PERIOD_H4 , 1 ) + ( Ask - Bid ) + 10 * Point ;
         if ( Ask < = Enter - StopLevel ) {
         RefreshRates ( ) ;
         OrderSend ( Symbol ( ) , OP_BUYSTOP , 0.1 , Enter , 0 , 0 , Enter + Profit , 0 , 0 , 0 , Green ) ; }
      }
  }
void DownTrend ( ) {
     if ( ( iOpen ( NULL , PERIOD_H4 , 1 ) - iClose ( NULL , PERIOD_H4 , 1 ) > = 0 ) & &
        ( iOpen ( NULL , PERIOD_H4 , 2 ) - iClose ( NULL , PERIOD_H4 , 2 ) < 0 ) ) {
         DellAllOrders ( ) ;
         Enter = iLow ( NULL , PERIOD_H4 , 1 ) - 10 * Point ;
         if ( Bid > = Enter + StopLevel ) {
         RefreshRates ( ) ;
         OrderSend ( Symbol ( ) , OP_SELLSTOP , 0.1 , Enter , 0 , 0 , Enter - Profit , 0 , 0 , 0 , Green ) ; }
      }
  }

   
//-------Вычисление стопа и утановка
void SetStop ( ) {
      RefreshRates ( ) ;
      b0 = iLow ( NULL , PERIOD_H4 , 0 ) - 10 * Point ;
      b1 = iLow ( NULL , PERIOD_H4 , 1 ) - 10 * Point ;
      s0 = iHigh ( NULL , PERIOD_H4 , 0 ) + ( Ask - Bid ) + 10 * Point ;
      s1 = iHigh ( NULL , PERIOD_H4 , 1 ) + ( Ask - Bid ) + 10 * Point ;
            
         if ( Type = = 0 ) {
            StopLoss = MathMax ( b0 , b1 ) ; //Функция возвращает максимальное из двух числовых значений
            if ( Bid - StopLoss < StopLevel ) StopLoss = MathMin ( b0 , b1 ) ; 
            else OrderModify ( OrderTicket ( ) , OrderOpenPrice ( ) , StopLoss , OrderTakeProfit ( ) , 0 , Red ) ;
         }
         if ( Type = = 1 ) {
            StopLoss = MathMin ( s0 , s1 ) ; //Функция возвращает минимальное из двух числовых значений
            if ( StopLoss - Ask < StopLevel ) StopLoss = MathMax ( s0 , s1 ) ;
            else OrderModify ( OrderTicket ( ) , OrderOpenPrice ( ) , StopLoss , OrderTakeProfit ( ) , 0 , Red ) ;
         }
   }


Swan >> :

...또는 즉시 주문 열기

미루고 다 같이 들어가는게 더 믿음직스럽습니다) 안그러면 DC에서 발급해주거나 농장이 아닌곳에서 많이 열어주겠죠..))

*수정된 코드

 
ALex2008 >> :

스톱레벨을 수정했습니다...


미루고 다 같이 들어가는게 더 믿음직스럽습니다.) 안그러면 DC가 뭔가를 주거나 농장이 아닌곳에서 많이 열어줄꺼에요..))

*수정된 코드

오래된 버그 수정, 새로운 버그 추가 :D


역시 수정)

 //+------------------------------------------------------------------+
//|                                                    CandyLite.mq4 |
//|                                                    Ш.Александр.В |
//|                                              shestovav@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Ш.Александр.В"
#property link       "shestovav@gmail.com"

#include <stdlib.mqh>

extern double Profit = 3000 ;

int Type , Ticket ;
double Stop , StopLevel , b0 , b1 , s0 , s1 , StopLoss , Enter ;
bool dwn , up , mod ;

int init ( ) {
   Profit * = Point ; 
   return ( 0 ) ;
   }

int deinit ( ) {
   return ( 0 ) ;
   }

int start ( ) {
   StopLevel = Point * MarketInfo ( Symbol ( ) , MODE_STOPLEVEL ) ;    // вычисление стоплевел //Point*
   
   if ( ! WorkOrders ( ) ) {
      UpTrend ( ) ;
      DownTrend ( ) ;
   }
      
   if ( WorkOrders ( ) ) {
       if ( ( Type < = 1 ) & & ( Stop = = 0 ) ) SetStop ( ) ;
       if ( ( Type = = 1 ) | | ( Type = = 5 ) ) UpTrend ( ) ;
       if ( ( Type = = 0 ) | | ( Type = = 4 ) ) DownTrend ( ) ;
   }

   return ( 0 ) ;
   }
//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend ( ) {
     if ( ( iOpen ( NULL , PERIOD_H4 , 1 ) - iClose ( NULL , PERIOD_H4 , 1 ) < = 0 ) & &
         ( iOpen ( NULL , PERIOD_H4 , 2 ) - iClose ( NULL , PERIOD_H4 , 2 ) > 0 ) ) {
         DellAllOrders ( ) ;
         Enter = iHigh ( NULL , PERIOD_H4 , 1 ) + ( Ask - Bid ) + 10 * Point ;
         if ( Ask < Enter - StopLevel + 0.5 * Point ) {
         OrderSend ( Symbol ( ) , OP_BUYSTOP , 0.1 , Enter , 0 , 0 , Enter + Profit , 0 , 0 , 0 , Green ) ; }
       }
   }
void DownTrend ( ) {
     if ( ( iOpen ( NULL , PERIOD_H4 , 1 ) - iClose ( NULL , PERIOD_H4 , 1 ) > = 0 ) & &
         ( iOpen ( NULL , PERIOD_H4 , 2 ) - iClose ( NULL , PERIOD_H4 , 2 ) < 0 ) ) {
         DellAllOrders ( ) ;
         Enter = iLow ( NULL , PERIOD_H4 , 1 ) - 10 * Point ;
         if ( Bid > Enter + StopLevel - 0.5 * Point ) {
         OrderSend ( Symbol ( ) , OP_SELLSTOP , 0.1 , Enter , 0 , 0 , Enter - Profit , 0 , 0 , 0 , Green ) ; }
       }
   }

//-------Вычисление стопа и установка
void SetStop ( ) {
       RefreshRates ( ) ;
      b0 = iLow ( NULL , PERIOD_H4 , 0 ) - 10 * Point ;
      b1 = iLow ( NULL , PERIOD_H4 , 1 ) - 10 * Point ;
      s0 = iHigh ( NULL , PERIOD_H4 , 0 ) + ( Ask - Bid ) + 10 * Point ;
      s1 = iHigh ( NULL , PERIOD_H4 , 1 ) + ( Ask - Bid ) + 10 * Point ;
            
         if ( Type = = 0 ) {
            StopLoss = MathMax ( b0 , b1 ) ; //Функция возвращает максимальное из двух числовых значений
             if ( Bid - StopLoss < StopLevel - 0.5 * Point ) StopLoss = MathMin ( b0 , b1 ) ; 
             if ( Bid - StopLoss > StopLevel - 0.5 * Point ) //можно попробовать убрать строку
             OrderModify ( OrderTicket ( ) , OrderOpenPrice ( ) , StopLoss , OrderTakeProfit ( ) , 0 , Red ) ;
         }
         if ( Type = = 1 ) {
            StopLoss = MathMin ( s0 , s1 ) ; //Функция возвращает минимальное из двух числовых значений
             if ( StopLoss - Ask < StopLevel - 0.5 * Point ) StopLoss = MathMax ( s0 , s1 ) ;
             if ( StopLoss - Ask > StopLevel - 0.5 * Point ) //можно попробовать убрать строку
             OrderModify ( OrderTicket ( ) , OrderOpenPrice ( ) , StopLoss , OrderTakeProfit ( ) , 0 , Red ) ;
         }
   }
   
//-------Удаление всех ордеров, открытых и отложенных
void DellAllOrders ( ) {
       if ( WorkOrders ( ) ) {
       if ( Type < = 1 ) OrderClose ( Ticket , OrderLots ( ) , OrderClosePrice ( ) , 10 ) ;
       else OrderDelete ( Ticket ) ; }
   }
  
//-------Поиск ордеров
bool WorkOrders ( ) {
       for ( int i = OrdersTotal ( ) - 1 ; i > = 0 ; i - - ) {
       if ( ! OrderSelect ( i , SELECT_BY_POS ) )    continue ;
       if ( OrderSymbol ( ) ! = Symbol ( ) )          continue ;
      Type   = OrderType ( ) ;
      Ticket = OrderTicket ( ) ;
      Stop   = OrderStopLoss ( ) ;
       return ( true ) ; }
   return ( false ) ;
   }
 
Swan >> :

오래된 버그를 수정하고 새로운 버그를 추가하세요 :D

무엇을 위해?

0.5*Point

그리고 MarketInfo()는 어쨌든 이중 유형을 반환합니다. 왜 Point로 변환해야 할까요?..

이것도 ... 두 가지 조건 ..


 if ( Bid - StopLoss < StopLevel - 0.5 * Point ) StopLoss = MathMin ( b0 , b1 ) ; 
if ( Bid - StopLoss > StopLevel - 0.5 * Point ) //можно попробовать убрать строку

내가 알아 차린 모든 것 .. 물론 무엇을 위해 변경되었는지 설명하는 것이 좋습니다. 그래서 나는 미래를 위해 기억합니다)

 
ALex2008 >> :

이것은 무엇을 위한 것입니까? 모르겠어요..)

그리고 MarketInfo()는 어쨌든 이중 유형을 반환합니다. 왜 Point로 변환해야 할까요?..

이것도...


0.5*포인트 - 델타, 0.7도 가능합니다 :)

실수 비교를 참조하십시오.

아마 그것 없이는 올바르게 작동할 것입니다. 대부분의 경우에)


실수는

 MarketInfo ( Symbol ( ) , MODE_STOPLEVEL )

핍으로 값을 반환합니다. 포인트로 곱합니다.


그것은

            if ( Bid - StopLoss < StopLevel ) StopLoss = MathMin ( b0 , b1 ) ; 
             else OrderModify ( OrderTicket ( ) , OrderOpenPrice ( ) , StopLoss , OrderTakeProfit ( ) , 0 , Red ) ;

true StopLoss에 새 값이 할당된 경우

그렇지 않으면 순서가 수정됩니다.

틀릴건 없지만 나다 아니면 십자가를 떼거나 바지를 입는다)

사유: