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

 
hoz :

7.43하고 잠자리에 들지 않았다면.. 즉, 성배가 쓰여지고 있다고 가정하겠습니다!

아니, 왜 그렇게 맹세해 :)) Yusuf는 나를 위해 성배 를 불러일으켰다. 여행가방에 앉아 하늘의 만나를 기다리며 몰디브로 갑니다 :))

 
artmedia70 :
글쎄, 당신이 거기에서 무엇을했는지 보여주세요 ... 여기에 텔레파시가 없습니다. 그들은 휴가 중입니다.

 extern string time1 = "n" ; // 
extern string time2= "m" ;
extern double lot= 0.2 ; // объявили лот
extern int slippage= 2 ; // объявили макс отклонение от цены





int start()
{
double max; // максимальная цена 6-ти свечей
double min; // минимальная цена 6-ти свечей
int hour1 = TimeHour(StrToTime(time1)); // время часы
int minute1 = TimeMinute(StrToTime(time1)); // время минуты


if (hour1 == TimeHour( TimeCurrent ()) && minute1 == TimeMinute( TimeCurrent ())) // если время подошло то
{
min=Low[iLowest( Symbol (), 0 ,MODE_LOW, 6 , 1 )]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest( Symbol (), 0 ,MODE_HIGH, 6 , 1 )]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min; // общий объем локалки последних 6 свечей М5
 int ticket1=- 1 ;
 int ticket2=- 1 ;
if ((volum<= 0.0018 )== true ) // если объем свечей меньше или равно z пунктов 

if (ticket1< 0 )
{ 
OrderSend ( Symbol (), OP_BUYSTOP, lot,max+ Point , 3 ,min- Point ,max+ 0.0022 , NULL , 0 ,time2, Red);
Alert ( GetLastError ());
}
if (ticket2< 0 )
{
OrderSend ( Symbol (), OP_SELLSTOP, lot,min- Point , 3 ,max+ Point ,min- 0.0022 , NULL , 0 ,time2, Yellow);
Alert ( GetLastError ());
}


return ;


if ( OrderSelect ( 1 ,SELECT_BY_POS,MODE_HISTORY)) ///если первый открытый ордер закрылся с профитом 
if (OrderProfit()> 0 )
{
OrderDelete(OrderTicket()); // удаляем второй отложенный
}

}



bool closeorder; //определим переменную закрытия ордеров
closeorder= true ;

if (closeorder== true ) // вечернее закрытие всех отложенных ордеров, и рыночных позиций
{
int hour2 = TimeHour(StrToTime(time2)); // вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour( TimeCurrent ()) && minute2 == TimeMinute( TimeCurrent ())) // если время ***
{ // определяем количество открытых позиций, и отложенных ордеров
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
 if ( OrderSelect ( 1 ,SELECT_BY_POS,MODE_TRADES)) break ; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage); // Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage); //Закрытие ордера селл если такой есть
if (OrderType()==OP_BUYSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный байстоп
}                    
if (OrderType()==OP_SELLSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный sellstop
}                    

나는 고문의 일반 코드를 던져서 그가해야 할 일을보다 명확하게했습니다.
그가 어디 바보인지 다시 말해줄게
열린 지연: 반대 없이 하나의 지연을 열거나 한 방향으로 전체 지연을 엽니다.
주문 삭제: 격일로 삭제하기도 하고, 보통 저녁에 명확히 정해진 시간에 문제 없이 삭제하기도 하고, 격일로 삭제하기도 하고 아예 닫지 않는 경우도 있습니다..

음, 조건은 다음과 같습니다.
첫 번째 미결 보류 중인 것이 이익으로 마감되면 두 번째 것을 즉시 삭제합니다. 또한 올바르게 썼는지 의심스럽습니다. 하지만 직장에서 확인할 수는 없습니다. 두 개의 반대 포지션을 열고 싶지 않기 때문입니다 = (((((((
 
artmedia70 :
마지막으로 마감된 주문을 검색할 때 가장 최근에 마감된 것을 먼저 찾아야 하지만 테이크업에 의한 클로징을 확인하려면 사이클 외부로 이동해야 합니다. 그렇다면 사이클에서 포착된 첫 번째 시간을 기억하고 가장 최근이 아닌 take에 의해 닫힌 시간을 기억합니다.


자, 이것은 코드 최적화 입니다. 내가 보는 바와 같이 결과는 이것에서 변하지 않을 것입니다. 계산하는 데 시간이 더 오래 걸릴 뿐입니다. 코드를 수정했지만 동일하게 작동합니다.

 //+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = - 1 ,               // Время закрытия последнего открытого ордера
            lastOOTMarket = - 1 ,           // Время открытия последнего открытого ордера рыночного
            lastOOTHist = - 1 ;             // Время открытия последнего открытого ордера из истории
   
   for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderType() > 1 ) continue ;               // Все удалённые отложки нас не интересуют..
  
       if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
          lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
       Comment ( "Время закрытия последнего ордера в истории lastOrderCloseTime = " , lastOrderCloseTime);
   }

   if ( MathAbs (OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return ( 0 );
       Comment ( "OrderTakeProfit() - OrderOpenPrice() < i_tp * pt = " , MathAbs (OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt);
   lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
       Comment ( "Время закрытия последнего ордера в истории lastOOTHist = " , lastOOTHist);
   
       Comment ( "Время открытия последнего открытого ордера = " , lastOOTHist);
  
   for ( int h= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {   
       if (! OrderSelect (h, SELECT_BY_POS, MODE_TRADES)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
      {
         if (lastOOTMarket < OrderOpenTime())
             lastOOTMarket = OrderOpenTime();
  
         if (lastOOTMarket < lastOOTHist)       // Если время открытия последнего открытого ордера (рыночного) ниже последнего открытого ордера из истории..
             lastOrderCloseTime = OrderCloseTime(); // Значит это искомый ордер
      }
   }

   Comment ( "Время закрытия последнего открытого ордера = " , lastOrderCloseTime);
   return (lastOrderCloseTime);
}

그러나 마치 그 안에 일종의 잼이 있습니다.

 
ex1m :

나는 고문의 일반 코드를 던져서 그가해야 할 일을보다 명확하게했습니다.
그가 어디 바보인지 다시 말해줄게
열린 지연: 반대 없이 하나의 지연을 열거나 한 방향으로 전체 지연을 엽니다.
주문 삭제: 격일로 삭제하기도 하고, 보통 저녁에 명확히 정해진 시간에 문제 없이 삭제하기도 하고, 격일로 삭제하기도 하고 아예 닫지 않는 경우도 있습니다..

음, 조건은 다음과 같습니다.
첫 번째 미결 보류 중인 것이 이익으로 마감되면 두 번째 것을 즉시 삭제합니다. 또한 올바르게 썼는지 의심스럽습니다. 하지만 직장에서 확인할 수는 없습니다. 두 개의 반대 포지션을 열고 싶지 않기 때문입니다 = (((((((



질문으로 질문에 답하겠습니다. 이게 뭔가요:

 if ((volum<= 0.0018 )== true ) // если объем свечей меньше или равно z пунктов 

이해가 안가서 설명해주세요 :)

포지션 개설 확인은 포지션 개설 시도 후에 이루어져야 합니다. 저것들.

 if (ticket1< 0 )

영장을 발송한 후 배치합니다.

지연을 열려면 가격이 각각 Ask 또는 Bid보다 높거나 낮아야 합니다. 다음과 같은 베이의 경우:

 if (OOP > Ask)
 
hoz :


이것은 코드 최적화입니다. 내가 보는 바와 같이 결과는 이것에서 변하지 않을 것입니다. 계산하는 데 시간이 더 오래 걸릴 뿐입니다. 코드를 수정했지만 동일하게 작동합니다.

그러나 마치 그 안에 일종의 잼이 있습니다.

아니요, 이것은 코드 최적화 가 아닙니다. 이것은 후자에 대한 검색일 뿐입니다. 모든 마감된 주문의 열거를 완료하고 가장 최근에 마감된 주문을 찾은 후에야 테이크에 의한 마감을 확인해야 하며, 그렇다면 테이크에 의해 마감된 경우에만 검색을 계속하는 것이 좋습니다. 나머지를 위해.

루프 내부에 테이크업에 의한 마감 수표를 넣으면 무엇을 얻을 수 있습니까? 논리 오류가 발생합니다.
1년 전에 마감된 주문을 선택했다고 가정해 보겠습니다. 어떤 경우든, 그 시간은 -1보다 클 것입니다. 이것은 우리가 테이크에 의해 닫히는지 확인했음을 의미합니다(결국 이 확인은 루프 내부의 코드에 있습니다). 예, 인수로 마감되었습니다... 귀하의 기능은 다음에 무엇을 합니까? 맞습니다. 1년 전 주문 접수로 마감된 작업을 계속합니다. 아직 오류가 있는 곳을 살펴보겠습니다. 그냥 집에있어...

 

2. 마지막 열린 포지션이 테이크업에 의해 닫히면 모든 것을 닫으세요!

글쎄, 그것은 다음과 같은 것을 의미합니다.

 //-----------------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos ( string sy, int mn, int delta) {
   datetime t= 0 ;
   int    i, k, 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()> 1 )             continue ;             // Сначала забыл вписать, подправил
         if (t<OrderCloseTime()) {t=OrderCloseTime(); j=i;}
         }
      }  
   // Нашли последнюю. Проверим её закрытие по тейку
   if ( OrderSelect (j,SELECT_BY_POS,MODE_HISTORY)) {                      
       if (OrderProfit()+OrderSwap()+OrderCommission()<= 0 )   return ( false );           // Закрыта с убытком или в ноль
       if ( MathAbs (OrderTakeProfit()-OrderClosePrice())>delta* Point ) return ( false );   // закрыта в профите, но не в пределах дельты
       else t=OrderOpenTime();     // Если последняя закрытая была закрыта по тейку (в пределах дельты), запомним время её открытия
      }
   else { Print ( "FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории" ); return ( false );}
// Здесь мы имеем последнюю закрытую позицию в профите и закрытую по тейку (в пределах дельты), ищем дальше
   k= OrdersTotal ()- 1 ;
   for (i=k; i>= 0 ; i--) {
       if ( OrderSelect (i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue ;
         if (OrderSymbol()!=sy)         continue ;
         if (OrderType()> 1 )             continue ;
         if (t<OrderOpenTime()) return ( false );   // Выбранная рыночная позиция открыта позже закрытой по тейку
         }
       else { Print ( "FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер" ); return ( false );}
      }
   return ( true );   // Найденная закрытая по тейку позиция была открыта позже всех, возвращаем её время открытия
}
//-----------------------------------------------------------------------------------------------+

확인하려는 기호, 매직 및 델타(포인트의 거리 == 주문 접수와 마감 가격의 차이)를 다음과 같이 함수에 전달합니다.

   if (isCloseByTakeLastOpenPos ( Symbol (), Magic, 5 )) { // Если последняя открытая была закрыта по тейку ...
       // ... тут обрабатываем эту ситуёвину
      }
   else {   // Иначе ...
       // тут обрабатываем, если последняя закрытая была открыта не последней или ...
       // ... последняя закрытая была закрыта с убытком или в профите, но за пределами дельты
      }

기능을 확인하지 않고 무릎에 썼습니다. 따라서 오류 검색 은 귀하에게 달려 있습니다.

int로 만들고 반환 코드를 사용할 수 있습니다. 예를 들어 원하는 위치가 존재하지 않거나 존재하지만 손실로 닫히면 -1을 반환하고,
그것이 존재하고 이익으로 마감되었지만 델타 내에 있지 않은 경우 0을 반환합니다.
그것이 존재하고 이익과 테이크업(델타 내)으로 마감된 경우 1을 반환합니다...

상상의 여지가 엄청나다...

 
artmedia70 :

루프 내부에 테이크업에 의한 마감 수표를 넣으면 무엇을 얻을 수 있습니까? 논리 오류가 발생합니다.

1년 전에 마감된 주문을 선택했다고 가정해 보겠습니다. 어떤 경우든, 그 시간은 -1보다 클 것입니다. 이것은 우리가 테이크에 의해 닫히는지 확인했음을 의미합니다(결국 이 확인은 루프 내부의 코드에 있습니다). 예, 티크에 폐쇄 ..


따라서 주기가 모든 주문에 있는 경우 어떤 경우에도 주기는 모든 주문을 통과합니다. 각 주문의 마감 시간은 이전에 선택한 주문과 비교됩니다. 여기에서만 성능이 저하됩니다. 왜냐하면 이익실현은 마지막 포지션뿐만 아니라 각 마감 포지션 에 대해 주기에서 지속적으로 확인됩니다. 그렇습니까!?
 
PapaYozh :

그래서.

그러나 시작 가격과 함께 Open[]이 있습니다.


알겠습니다, 감사합니다 :)
 
hoz :

따라서 주기가 모든 주문에 있는 경우 어떤 경우에도 주기는 모든 주문을 통과합니다. 각 주문의 마감 시간은 이전에 선택한 주문과 비교됩니다. 여기에서만 성능이 저하됩니다. 왜냐하면 이익을 취하는 것은 마지막 위치뿐만 아니라 각 마감 위치에 대해 주기에서 지속적으로 확인됩니다. 그렇습니까!?
이미 예제 함수를 작성했습니다.
 
hoz :

따라서 주기가 모든 주문에 있는 경우 어떤 경우에도 주기는 모든 주문을 통과합니다. 각 주문의 마감 시간은 이전에 선택한 주문과 비교됩니다. 여기에서만 성능이 저하됩니다. 왜냐하면 이익을 취하는 것은 마지막 위치뿐만 아니라 각 마감 위치에 대해 주기에서 지속적으로 확인됩니다. 그렇습니까!?

다음은 조인트입니다.

   for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
       if (OrderType() > 1 ) continue ;               // Все удалённые отложки нас не интересуют.. 
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
          lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
      
       if ( MathAbs (OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return ( 0 ); // ЗДЕСЬ ВЫХОДИМ ПРИ ПЕРВОМ ВСТРЕЧНОМ
      
      lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
   }