Скрипт "Закрыть все ордера"

 
 
Просто закрыть - это мало.
Надо ещё проанализировать есть ли встречные.
Если есть - закрыть их встречно. Это и спред экономит и время.
А если етсь, да не равные, то сначала закрыть большую часть, а потом меньшую..
Отсортировать.. В общем, получится прибл. следующее ( для непосредственной работы немного доработать)
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // AG_Pri_win_scr.mq4 // Предназначен для работы в качестве функции в программном комплексе AutoGraf. // Сортировка ордеров в масиве Mas_Rea_win в соответствии с приоритетами. // // Автор: Сергей Ковалёв, Днепропетровск, sk@mail.dnepr.net //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // // //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж include жжжж //#include <AG_Peremen_scr.mq4> // Файл описания переменных скрипта. //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // // //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int AG_Pri_win_scr() { // Массив сформирован в прелах одного цикла //..т.е, условно одномоментно, но надо .. //..передать этот массив на формирование.. //..отсортированным в порядке приоритета.. //..ордеров в соответствии признаками. if(Mas_Rea_win[0][0]>0) { //==================================================================================================================== // Сортировка методом Пузырька. // Красивое слово - Пузырёк:) // 1 = поднимать строку // 0 = строки равносильны по тек. признаку // -1 = остановить строку на текущем месте for (i=2;i<=Mas_Rea_win[0][0];i++) // По строкам вниз { for (t=i;t>=2;t--) // По строкам вверх (цикл подъёма строки) { a=t-1; // Индекс верхней строки (t - нижней) //-------------------------------------------------------------------------------------------------------------------- Ret=Priznak_1(); // 1. Закрытие. if (Ret== 1) { Barter(); // Обмен значениями в строках - подъём. continue; // Попробуем подняться выше } if (Ret==-1) break; // Верхняя сильнее - выходим. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (Ret== 0) // Оба не хотят закрываться { Ret=Priznak_2(); // 2. Удалённость от "курса назначения". if (Ret== 1) // Обмен значениями в строках - подъём. { Barter(); // Обмен значениями в строках - подъём. continue; // Попробуем подняться выше } if (Ret==-1) break; // Верхняя сильнее - выходим. } //-------------------------------------------------------------------------------------------------------------------- // Оба хотят закрываться или модификация Ret=Priznak_3(); // 3. Тип ордера. if (Ret== 1) { Barter(); // Обмен значениями в строках - подъём. continue; // Попробуем подняться выше } if (Ret==-1) break; // Верхняя сильнее - выходим. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ret=Priznak_4(); // 4. Стоимость ордера if (Ret== 1) { Barter(); // Обмен значениями в строках - подъём. continue; // Попробуем подняться выше } if (Ret==-1) break; // Верхняя сильнее - выходим. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ret=Priznak_5(); // 5. Номер ордера. if (Ret== 1) { Barter(); // Обмен значениями в строках - подъём. continue; // Попробуем подняться выше } if (Ret==-1) break; // Верхняя сильнее - выходим. //-------------------------------------------------------------------------------------------------------------------- } } //==================================================================================================================== } return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int Barter() // Обмен значениями в строках - Бартер:) { for (j=0;j<=9;j++) { double Perevalka=Mas_Rea_win[a][j]; // Прибережём значеньице Mas_Rea_win[a][j]=Mas_Rea_win[t][j]; // Обмен значений Mas_Rea_win[t][j]=Perevalka; // Прибережённое сгодилось } return; } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int Priznak_1() // Признак закрытия { Mas_Rea_win[a][1]=NormalizeDouble(Mas_Rea_win[a][1],Digits); // Нормализуем перед сравнением Mas_Rea_win[t][1]=NormalizeDouble(Mas_Rea_win[t][1],Digits); // Нормализуем перед сравнением //-------------------------------------------------------------------------------------------------------------------- if (Mas_Rea_win[a][1]>=0) // Не закрытие { if (Mas_Rea_win[t][1]>=0)return(0); // Не закрытие if (Mas_Rea_win[t][1]< 0)return(1); // Закрытие } if (Mas_Rea_win[a][1]< 0) // Закрытие { if (Mas_Rea_win[t][1]>=0)return(-1); // Не закрытие if (Mas_Rea_win[t][1]< 0)return(2); // Закрытие } //-------------------------------------------------------------------------------------------------------------------- return(0); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int Priznak_2() // Удалённость от "курса назначения". { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for (j=1;j<=3;j++) // Для начала выясним макс удалённость { k=j+6; // Индекс для тек. значений ордера Mas_Rea_win[a][j]=NormalizeDouble(Mas_Rea_win[a][j],Digits); // Нормализуем перед сравнением Mas_Rea_win[t][j]=NormalizeDouble(Mas_Rea_win[t][j],Digits); // Нормализуем перед сравнением Mas_Rea_win[a][k]=NormalizeDouble(Mas_Rea_win[a][k],Digits); // Нормализуем перед сравнением Mas_Rea_win[t][k]=NormalizeDouble(Mas_Rea_win[t][k],Digits); // Нормализуем перед сравнением Chislo[0]=0; // Обнуление перед началом событий Chislo[1]=0; // Обнуление перед началом событий if (Mas_Rea_win[a][j]>0) // Выясним максимальные пожелания Chislo[0]=MathMax(Chislo[0],MathAbs(Mas_Rea_win[a][j]-Mas_Rea_win[a][k])); if (Mas_Rea_win[t][j]>0) // Выясним максимальные пожелания Chislo[1]=MathMax(Chislo[1],MathAbs(Mas_Rea_win[t][j]-Mas_Rea_win[t][k])); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (Chislo[0]> Chislo[1])return(-1); // Верхний сильнее if (Chislo[0]==Chislo[1])return( 0); // Силы равны if (Chislo[0]< Chislo[1])return( 1); // Строчный хочет на большее расстояние } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int Priznak_3() // Признак открытого/отложенного ордера { if (Mas_Rea_win[a][6]>2) // Отложенный ордер { if (Mas_Rea_win[t][6]>2)return(0); // Отложенный ордер if (Mas_Rea_win[t][6]<3)return(1); // Явный ордер } if (Mas_Rea_win[a][6]<3) // Явный ордер { if (Mas_Rea_win[t][6]>2)return(-1); // Отложенный ордер if (Mas_Rea_win[t][6]<3)return(0); // Явный ордер } } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int Priznak_4() // Признак стоимости ордера { Mas_Rea_win[a][5]=NormalizeDouble(Mas_Rea_win[a][5],2); // Нормализуем перед сравнением, 2 на всяк Mas_Rea_win[t][5]=NormalizeDouble(Mas_Rea_win[t][5],2); // случай, мало ли какие условия у ДЦ if (Mas_Rea_win[a][5]> Mas_Rea_win[t][5])return(-1); // Нижний ордер дешевле if (Mas_Rea_win[a][5]==Mas_Rea_win[t][5])return( 0); // Стоимость ордеров одинаковая if (Mas_Rea_win[a][5]< Mas_Rea_win[t][5])return( 1); // Нижний ордер дороже } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж int Priznak_5() // Признак номера ордера { // Последнее и нерушимое: или-или if (Mas_Rea_win[a][4]>Mas_Rea_win[t][4])return(-1); // У строчного ордера меньший (ранний)номер if (Mas_Rea_win[a][4]<Mas_Rea_win[t][4])return( 1); // У строчного ордера больший(поздний)номер } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж /* // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Mas_Rea_win[31][10], // Массив ордеров, на которые надо отреагировать // [0][0]=колич. ордеров в массиве // 1й индекс = порядкоывй номер ордера в этом массиве // [][1] желаемый курс откр. ордера (абс. знач. курса) // [][2] желаемый StopLoss ордера (абс. знач. курса) // [][3] желаемый TakeProfit ордера (абс. знач. курса) // [][4] номер ордера // [][5] колич. лотов ордера (абсолютное знач. курса) // [][6] тип ордера 1=B,2=S,3=BL,4=SL,5=BS,6=SS // [][7] текущий курс откр. ордера (абс. знач. курса) // [][8] текущий StopLoss ордера (абс. знач. курса) // [][9] текущий TakeProfit ордера (абс. знач. курса) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Mas_Prioritet[91][11], (90 - нет? А сколько?) // Массив ордеров, назначенных к торговым опрациям // [0][0]=колич. ордеров в массиве // 1й инд. = порядк. номер ордера // [][0] номер ордера при встречном закрытиии // [][1] желаемый курс откр. ордера (абс. знач. курса) // [][2] желаемый StopLoss ордера (абс. знач. курса) // при встречн. закр сюда пишем Магическое число // [][3] желаемый TakeProfit ордера (абс. знач. курса) // [][4] номер ордера (для модификации и закрытия) // [][5] колич. лотов ордера // [][6] тип ордера 1=B,2=S,3=BL,4=SL,5=BS,6=SS // [][7] тип торговой операции в соотв. с Tip_TO (см) // [][8] текущий Bid // [][9] текущий Ask // [][10] Магическое число ордера j[2]| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | | | OP | SL | TP |Ном.орд| |Тип.орд|Тип.тор| Bid | Ask | Магич | i[1] | | | | | | | |операци| | | число | -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 0 | 3 | 1.2345| 1.2300| 1.2399| 0 | 0.7 | 1 | 1 | | | | -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 1 | 0 | 1.2333| 1.2399| -1 |1234568| 0.1 | 2 | 5 | | | | -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 2 | 0 | -1 | 1.2333| 1.2399|1234555| 0.1 | 1 | 3 | | | | -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 3 | 0 | -1 | 0 | 0 |1234777| 0.1 | 1 | 2 | | |9876543| -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 4 | 0 | 1.2377| 1.2300| 1.2399| 0 | 0 | 5 | 1 | | | | -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 5 |1234444| -1 | 0 | 0 |1234567| 0.5 | 0 | 4 | | | | -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | | | -------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ ... // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tip_TO, // Тип торговой операции // 0 = массив пустой и все ордера исполнены // 1 = открытие явных и отложенных ордеров // 2 = закрытие явных ордеров // 3 = удаление отложенных ордеров // 4 = встречное закрытие // 5 = модификация ордеров // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Принятые приоритеты. 1. Ручное воздействие 11. Закрытие ордеров. 111.Закрытие открытых ордеров. 112.Если назначено к закр. 2 встречн. ордера(в т.ч. из атомат.назначения), то частичное или полное встречное закрытие. 113.Закрытие самого тяжёлого ордера из назначенных к закрытию "с руки". 114.Удаление отложенных ордеров. 12. Модификация ордеров. 221.Модификация ордера, наиболее удалённого от "курса назначения" . 122.Модификация открытых ордеров 123.Модификация отложенных ордеров. 124.Модификация самого тяжёлого ордера из (одновременно "с руки") назначенных к модификации. 125.Модификация ранее созданного ордера. 13. Открытие ордеров (в массиве Mas_Rea_win нет, здесь не рассматривается)
Причина обращения: