public decimal Lot(decimal min_sum) // расчет минимального лота { market_price = 1; market_price = _tab.PriceCenterMarketDepth; min_lot = MyBlanks.Okruglenie(min_sum / market_price, size_comma_lot.ValueInt); return(min_lot); }
decimal Balans_kvot(string kvot_name) // запрос квотируемых средств (денег) в портфеле - название присваивается в kvot_name { List <PositionOnBoard> poses = _tab.Portfolio.GetPositionOnBoard(); decimal vol_kvot = 0; decimal vol_kvot_blok = 0; for (int i = 0; i < poses.Count; i++) { if (poses[i].SecurityNameCode == kvot_name) { vol_kvot = poses[i].ValueCurrent; vol_kvot_blok = poses[i].ValueBlocked; break; } } if (vol_kvot != 0) { if (uchet_blok_sred_vkl.ValueBool == true) { depo = vol_kvot + vol_kvot_blok; } else { depo = vol_kvot; } } Console.WriteLine(" Депо сейчас " + MyBlanks.Okruglenie(depo, 3) + " $"); return(depo); }
decimal Balans_tovara(string tovar_name) // запрос торгуемых средств в портфеле (в BTC ) название присваивается в tovar_name { List <PositionOnBoard> poses = _tab.Portfolio.GetPositionOnBoard(); decimal vol_instr = 0; decimal vol_instr_blok = 0; for (int i = 0; i < poses.Count; i++) { if (poses[i].SecurityNameCode == tovar_name) { vol_instr = poses[i].ValueCurrent; // текущий объем vol_instr_blok = poses[i].ValueBlocked; // блокированный объем break; } } if (vol_instr >= 0) { if (uchet_blok_sred_vkl.ValueBool == true) // { tovar = vol_instr + vol_instr_blok; } if (uchet_blok_sred_vkl.ValueBool == false) { tovar = vol_instr; } } Console.WriteLine(" Баланс товара = " + MyBlanks.Okruglenie(tovar, 6) + " " + tovar_name + " На " + MyBlanks.Okruglenie(tovar * market_price, 2) + "$"); return(tovar); }
decimal VolumForPiramid() // рассчитывает объем для пирамиды { market_price = _tab.PriceCenterMarketDepth; Percent_tovara(); Lot(min_sum.ValueDecimal); if (30 <= percent_tovara && percent_tovara < 70) // режим набора товара и ожидания прибыли { Balans_kvot(kvot_name); market_price = _tab.PriceCenterMarketDepth; decimal vol = depo / 100 * start_per_depo.ValueInt; if (vol <= min_sum.ValueDecimal) { return(min_lot); } return(MyBlanks.Okruglenie(vol / market_price, size_comma_lot.ValueInt)); } if (start_per_depo.ValueInt <= percent_tovara && percent_tovara < 30) // режим набора товара { decimal uge = _tab.PositionsLast.MaxVolume; // максимальный объем в позиции decimal vol = uge / 2; if (vol <= min_lot) { return(min_lot); } else { return(MyBlanks.Okruglenie(vol, size_comma_lot.ValueInt)); } } return(min_lot); }
decimal Portfolio_sum() // расчет начального состояния портфеля по торгуемой паре { Balans_kvot(kvot_name); Balans_tovara(tovar_name); portfolio_sum = MyBlanks.Okruglenie(depo + tovar * market_price, 3); return(portfolio_sum); }
void Piramida() // докупаем в позицию { Percent_birgi(); Lot(min_sum.ValueDecimal); VolumForPiramid(); if (vkl_piramid.ValueBool == false) { return; } List <Position> positions = _tab.PositionsOpenAll; if (positions.Count != 0) { decimal zen = _tab.PositionsLast.EntryPrice; if (market_price > zen + _kom + _do_piram) { decimal vol = VolumForPiramid(); if (vol >= min_lot) { if (positions[0].State != PositionStateType.Opening || positions[0].State == PositionStateType.Open) { _tab.BuyAtMarketToPosition(positions[0], MyBlanks.Okruglenie(vol, 6)); Console.WriteLine(" Пирамида- докупили НА - " + MyBlanks.Okruglenie(vol * market_price, 6) + " $"); Price_kon_trade(); // перепроверяем цену последних сделок Percent_tovara(); // смотрим процент купленного товара Thread.Sleep(1500); } } } } }
void Usrednenie() // усреднение позиций при снижении рынка { List <Position> positions = _tab.PositionsOpenAll; decimal per = Percent_birgi(); Price_kon_trade(); Lot(min_sum.ValueDecimal); decimal z = _tab.PositionsLast.EntryPrice; if (z > market_price + _deltaUsredn + per && bol_Down > market_price) // если цена ниже последнего трейда и выше машки //if (z > market_price + _deltaUsredn + per && volum_ma_short < market_price) // если цена ниже последнего трейда и выше машки { min_lot = Lot(min_sum.ValueDecimal); Balans_kvot(kvot_name); Balans_tovara(tovar_name); decimal v = VolumForUsred(); if (v > min_lot) { if (_tab.PositionsLast.MyTrades.Count != 0) { Price_kon_trade(); if (positions[0].State != PositionStateType.Opening) { _tab.BuyAtMarketToPosition(positions[0], MyBlanks.Okruglenie(v, 6)); } } Price_kon_trade(); // перепроверяем цену последних сделок Thread.Sleep(1500); Percent_tovara(); // смотрим процент купленного товара Console.WriteLine("Усреднились НА - " + v * _tab.PriceBestAsk + " $"); } } }
public decimal Lot(decimal min_sum) // расчет минимального лота { // костыль market_price = 1m; market_price = _tab.PriceCenterMarketDepth; min_lot = MyBlanks.Okruglenie(min_sum / market_price, 6); return(min_lot); }
void Start() // метод с которого робот начинает работу { if (start_metod_vkl == false) // для выключения метода { return; } List <Position> positions = _tab.PositionsOpenAll; if (positions.Count != 0) // если есть открытые позиции старт невозможен ! { Console.WriteLine(" есть открытые позиции старт невозможен ! "); return; } Restart_settings(); // перезапись настроек для старта Thread.Sleep(300); Lot(min_sum.ValueDecimal); portfolio_sum = 0; Portfolio_sum(); // сумма в портфеле start_sum = portfolio_sum; // запись старта портфеля Console.WriteLine(" записали сумму портфеля " + start_sum); decimal vol_start = MyBlanks.Okruglenie(Balans_kvot(kvot_name) / 100 * start_per_depo.ValueInt, size_comma_lot.ValueInt); if (vol_start > min_sum.ValueDecimal) { if (vkl_Robota.ValueBool == false) // отключение робота { return; } if (block_in == true) { Console.WriteLine("Включилась блокировка старта"); return; } if (_tab.PositionsOpenAll.Count == 0 && // нет открытых позиций volum_ma_short < market_price && // рынок выше короткой машки volum_ma_long > market_price) // рынок ниже длинной машки { decimal w = MyBlanks.Okruglenie(vol_start / market_price, size_comma_lot.ValueInt); _tab.BuyAtLimit(w, market_price); Console.WriteLine(" Стартуем ордером на = " + MyBlanks.Okruglenie(w * market_price, size_comma_lot.ValueInt) + " $ по цене " + market_price); Thread.Sleep(1500); Price_kon_trade(); // перепроверяем цену последних сделок Percent_tovara(); // смотрим процент купленного товара } } else { Console.WriteLine(" Сумма для старта " + vol_start + " маловато, измени % входа или пополни баланс"); } if (positions.Count != 0) // первая позиция открылась, выключаем метод { start_metod_vkl = false; Console.WriteLine(" выключили метод старт"); } }
void MiddleMarketVolumeCalculat() // расчет объемов средних продаж на рынке { decimal v_1 = 0; decimal v_2 = 0; decimal v_3 = 0; v_1 = _vol.Values[_vol.Values.Count - 2]; // складываем последние три уже завершенные свечи v_2 = _vol.Values[_vol.Values.Count - 3]; v_3 = _vol.Values[_vol.Values.Count - 4]; middle_market_vol = MyBlanks.Okruglenie((v_1 + v_2 + v_3) / 3, 1); }
decimal Percent_tovara() // расчет % объема купленного товара в портфеле { decimal st = Portfolio_sum(); decimal kv = Balans_kvot(kvot_name); decimal rasxod = st - kv; decimal per = rasxod / st * 100; percent_tovara = MyBlanks.Okruglenie(per, 2); Console.WriteLine(" процент товара сейчас " + percent_tovara); return(percent_tovara); }
void Start() // метод с которого робот начинает работу { if (start_metod_vkl == false) // для выключения метода { return; } List <Position> positions = _tab.PositionsOpenAll; if (positions.Count != 0) // если есть открытые позиции старт невозможен ! { Console.WriteLine(" есть открытые позиции старт невозможен ! "); return; } Payment_profit(); // рассчитываем прибыль предыдущей сделки Thread.Sleep(200); Restart_settings(); // перезапись настроек для старта Thread.Sleep(300); Lot(min_sum.ValueDecimal); portfolio_sum = 0; Portfolio_sum(); // сумма в портфеле start_sum = portfolio_sum; // запись старта портфеля Console.WriteLine(" записали сумму портфеля " + start_sum); market_price = _tab.PriceCenterMarketDepth; decimal vol_start = MyBlanks.Okruglenie(Balans_kvot(kvot_name) / 100 * start_per_depo.ValueInt, 6); if (vol_start > min_sum.ValueDecimal) { if (vkl_Robota.ValueBool == false) // отключение робота { return; } if (_tab.PositionsOpenAll.Count == 0) { decimal w = MyBlanks.Okruglenie(vol_start / market_price, 6); _tab.BuyAtLimit(w, market_price); Console.WriteLine(" Стартуем ордером на = " + MyBlanks.Okruglenie(w * market_price, 6) + " $ по цене " + market_price); Thread.Sleep(1500); } } else { Console.WriteLine(" Сумма для старта " + vol_start + " маловато, измени % входа или пополни баланс"); } if (positions.Count != 0) // первая позиция открылась, выключаем метод { start_metod_vkl = false; Console.WriteLine(" выключили метод старт"); } }
public decimal bol_Down; // последние значение нижнего уровня болинждера private void _tab_MarketDepthUpdateEvent(MarketDepth marketDepth) // событие стакана { market_price = _tab.PriceCenterMarketDepth; volum_ma_short = _ma_short.Values[_ma_short.Values.Count - 1]; // записывается значение индикатора MA volum_ma_long = _ma_long.Values[_ma_long.Values.Count - 1]; // записывается значение индикатора MA if (volum_ma_short < market_price) { block_in = false; Console.WriteLine("Значение МА допустимое, блокировка старта выключена "); } Console.WriteLine(" Min Лот сейчас = " + MyBlanks.Okruglenie(Lot(min_sum.ValueDecimal), 3)); Console.WriteLine(" комиссия равна = " + MyBlanks.Okruglenie(Percent_birgi() / 2, 5)); }
public decimal bol_Down; // последние значение нижнего уровня болинждера private void _tab_MarketDepthUpdateEvent(MarketDepth marketDepth) // событие стакана { Console.WriteLine(" Min Лот сейчас = " + MyBlanks.Okruglenie(Lot(min_sum.ValueDecimal), 3)); Console.WriteLine(" комиссия равна = " + MyBlanks.Okruglenie(Percent_birgi() / 2, 5)); market_price = _tab.PriceCenterMarketDepth; bol_Up = _bolin.ValuesUp[_bolin.ValuesUp.Count - 2]; // последние значение верхнего уровня болинждера bol_Down = _bolin.ValuesDown[_bolin.ValuesDown.Count - 2]; // последние значение нижнего уровня болинждера volum_ma_short = _ma_short.Values[_ma_short.Values.Count - 1]; // записывается значение индикатора MA volum_ma_long = _ma_long.Values[_ma_long.Values.Count - 1]; // записывается значение индикатора MA if (volum_ma_short < market_price) { block_in = false; Console.WriteLine("Значение МА допустимое, блокировка старта выключена "); } }
decimal VolumForUsred() // рассчитывает объем для усреднения покупок { Balans_kvot(kvot_name); market_price = _tab.PriceCenterMarketDepth; decimal uge = _tab.PositionsLast.MaxVolume; // максимальный объем в позиции decimal dob = uge * velich_usrednen.ValueDecimal; // добавляем объема decimal vol = uge + dob; if (depo / market_price <= vol) { decimal d1 = depo / market_price - 5 * min_lot; if (d1 > min_lot) { return(d1); } return(min_lot); } else { return(MyBlanks.Okruglenie(vol, size_comma_lot.ValueInt)); } }
void Switching_mode() // метод переключения режимов работы { decimal greed_average = MyBlanks.Okruglenie(greed_max.ValueDecimal + greed.ValueDecimal / 2, 2); // расчет среднего значения жадности Percent_tovara(); if (pir_of.ValueDecimal <= percent_tovara) // место отключения режима пирамида { vkl_piramid.ValueBool = false; Console.WriteLine(" после набора " + pir_of.ValueDecimal + " % отключили режим набора пирамидой"); } if (prof_on.ValueDecimal <= percent_tovara) // место включения режима профит { sav_profit_metod_vkl = true; Console.WriteLine(" после набора " + prof_on.ValueDecimal + " % включили режим сохранения прибыли "); } if (middle_market_vol <= sprint.ValueInt) // режим обычной торговли { Console.WriteLine(" РЕЖИМ Обычный "); if (70 <= percent_tovara && percent_tovara < 90) // режим фиксации прибыли { Console.WriteLine(" включился режим фиксации прибыли от 70 %"); profit.ValueInt = 4; Console.WriteLine(" до профита " + profit.ValueInt); _deltaUsredn = deltaUsredn.ValueDecimal * 3.5m; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _temp_greed = greed_max.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } if (50 <= percent_tovara && percent_tovara < 70) // режим разворота и ожидания прибыли { Console.WriteLine(" включился режим разворота и ожидания прибыли до 70 %"); Console.WriteLine(" включили метод выставления профита"); profit.ValueInt = 6; Console.WriteLine(" до профита " + profit.ValueInt); _do_piram = do_piram.ValueDecimal * 2m; Console.WriteLine(" расстояние до пирамиды изменено на " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal * 3; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _temp_greed = greed_average; // средняя жадность Console.WriteLine("Жадность теперь " + _temp_greed); } if (prof_on.ValueDecimal <= percent_tovara && percent_tovara < 50) // режим набора товара и ожидания прибыли { sav_profit_metod_vkl = true; Console.WriteLine(" включился режим набора товара от " + prof_on.ValueDecimal + " до 50%"); profit.ValueInt = 8; Console.WriteLine(" до профита " + profit.ValueInt); _do_piram = do_piram.ValueDecimal * 1.5m; Console.WriteLine(" расстояние до пирамиды изменено на " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal * 2; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _temp_greed = greed.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } if (start_per_depo.ValueInt <= percent_tovara && percent_tovara < prof_on.ValueDecimal) // режим набора товара { Console.WriteLine(" включился режим набора товара до " + prof_on.ValueDecimal + " %"); _do_piram = do_piram.ValueDecimal / 2; Console.WriteLine(" расстояние до пирамиды " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal / 2; Console.WriteLine("Расстояние до Усреднения " + _deltaUsredn); _temp_greed = greed.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } } // настройки обычного режима else // настройки turbo режим- рынок с большими объемами { Console.WriteLine(" СКОРОСТНОЙ РЕЖИМ Рынка"); if (70 <= percent_tovara && percent_tovara < 90) // режим фиксации прибыли { Console.WriteLine(" включился режим фиксации прибыли от 70 %"); profit.ValueInt = 4; Console.WriteLine(" до профита " + profit.ValueInt); _deltaUsredn = deltaUsredn.ValueDecimal * 4m + turbo_shift.ValueDecimal; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _temp_greed = greed_max.ValueDecimal + 0.25m; Console.WriteLine("Жадность теперь " + _temp_greed); } if (50 <= percent_tovara && percent_tovara < 70) // режим разворота и ожидания прибыли { Console.WriteLine(" включился режим разворота и ожидания прибыли до 70 %"); Console.WriteLine(" включили метод выставления профита"); profit.ValueInt = 6; Console.WriteLine(" до профита " + profit.ValueInt); _do_piram = do_piram.ValueDecimal * 2m; Console.WriteLine(" расстояние до пирамиды изменено на " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal * 3 + turbo_shift.ValueDecimal; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _temp_greed = greed_average + 0.15m; // средняя жадность Console.WriteLine("Жадность теперь " + _temp_greed); } if (prof_on.ValueDecimal <= percent_tovara && percent_tovara < 50) // режим набора товара и ожидания прибыли { sav_profit_metod_vkl = true; Console.WriteLine(" включился режим набора товара от " + prof_on.ValueDecimal + " до 50%"); profit.ValueInt = 8; Console.WriteLine(" до профита " + profit.ValueInt); _do_piram = do_piram.ValueDecimal * 1.5m; Console.WriteLine(" расстояние до пирамиды изменено на " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal * 2 + turbo_shift.ValueDecimal; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _temp_greed = greed.ValueDecimal + 0.1m; Console.WriteLine("Жадность теперь " + _temp_greed); } if (start_per_depo.ValueInt <= percent_tovara && percent_tovara < prof_on.ValueDecimal) // режим набора товара { Console.WriteLine(" включился режим набора товара до " + prof_on.ValueDecimal + " %"); _do_piram = do_piram.ValueDecimal / 2; Console.WriteLine(" расстояние до пирамиды " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal / 2; Console.WriteLine("Расстояние до Усреднения " + _deltaUsredn); _temp_greed = greed.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } } }
void Switching_mode() // метод переключения режимов работы { decimal greed_average = MyBlanks.Okruglenie(greed_max.ValueDecimal + greed.ValueDecimal / 2, 2); // расчет среднего значения жадности Percent_tovara(); decimal g = Greed(); // вычисляет жадность Console.WriteLine(" Жадность g = " + MyBlanks.Okruglenie(g, 3)); _do_profit_temp = MyBlanks.Okruglenie(profit.ValueInt / g, 2); // динамическое вычисление расстояния до профит ордера Console.WriteLine(" До профит ордера расстояние = " + _do_profit_temp); if (pir_of.ValueDecimal <= percent_tovara) // место отключения режима пирамида { vkl_piramid.ValueBool = false; Console.WriteLine(" после набора " + pir_of.ValueDecimal + " % отключили режим набора пирамидой"); } if (prof_on.ValueDecimal <= percent_tovara) // место включения режима профит { sav_profit_metod_vkl = true; Console.WriteLine(" после набора " + prof_on.ValueDecimal + " % включили режим сохранения прибыли "); } if (middle_market_vol <= sprint.ValueInt) // режим обычной торговли { Console.WriteLine(" РЕЖИМ Обычный "); _do_piram = do_piram.ValueDecimal * percent_tovara / 10; Console.WriteLine(" расстояние до пирамиды изменено на " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal * percent_tovara / 10; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _tmpArarm = volum_alarm.ValueInt; Console.WriteLine(" аварийный объем = " + _tmpArarm); if (70 <= percent_tovara && percent_tovara < 90) // режим фиксации прибыли { Console.WriteLine(" включился режим фиксации прибыли от 70 %"); _temp_greed = greed_max.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } if (50 <= percent_tovara && percent_tovara < 70) // режим разворота и ожидания прибыли { Console.WriteLine(" включился режим разворота и ожидания прибыли до 70 %"); _temp_greed = greed_average; // средняя жадность Console.WriteLine("Жадность теперь " + _temp_greed); } if (prof_on.ValueDecimal <= percent_tovara && percent_tovara < 50) // режим набора товара и ожидания прибыли { sav_profit_metod_vkl = true; Console.WriteLine(" включился режим набора товара от " + prof_on.ValueDecimal + " до 50%"); _temp_greed = greed.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } if (start_per_depo.ValueInt / 2 <= percent_tovara && percent_tovara < prof_on.ValueDecimal) // режим набора товара { Console.WriteLine(" включился режим набора товара до " + prof_on.ValueDecimal + " %"); _temp_greed = greed.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } } // настройки обычного режима else // настройки turbo режим- рынок с большими объемами { Console.WriteLine(" СКОРОСТНОЙ РЕЖИМ Рынка"); _do_piram = do_piram.ValueDecimal * percent_tovara / 10 + turbo_shift.ValueDecimal; Console.WriteLine(" расстояние до пирамиды изменено на " + _do_piram); _deltaUsredn = deltaUsredn.ValueDecimal * percent_tovara / 10 + turbo_shift.ValueDecimal; Console.WriteLine("Расстояние до Усреднения теперь " + _deltaUsredn); _tmpArarm = volum_alarm.ValueInt * 2; // аварийный объем увеличили в два раза Console.WriteLine(" аварийный объем увеличили в два раза = " + _tmpArarm); if (70 <= percent_tovara && percent_tovara < 90) // режим фиксации прибыли { Console.WriteLine(" включился режим фиксации прибыли от 70 %"); _temp_greed = greed_max.ValueDecimal + 0.25m; Console.WriteLine("Жадность теперь " + _temp_greed); } if (50 <= percent_tovara && percent_tovara < 70) // режим разворота и ожидания прибыли { Console.WriteLine(" включился режим разворота и ожидания прибыли до 70 %"); _temp_greed = greed_average + 0.15m; // средняя жадность Console.WriteLine("Жадность теперь " + _temp_greed); } if (prof_on.ValueDecimal <= percent_tovara && percent_tovara < 50) // режим набора товара и ожидания прибыли { sav_profit_metod_vkl = true; Console.WriteLine(" включился режим набора товара от " + prof_on.ValueDecimal + " до 50%"); _temp_greed = greed.ValueDecimal + 0.1m; Console.WriteLine("Жадность теперь " + _temp_greed); } if (start_per_depo.ValueInt / 2 <= percent_tovara && percent_tovara < prof_on.ValueDecimal) // режим набора товара { Console.WriteLine(" включился режим набора товара до " + prof_on.ValueDecimal + " %"); _temp_greed = greed.ValueDecimal; Console.WriteLine("Жадность теперь " + _temp_greed); } } }